如果您尝试从传递给应用的函数中返回多个值,并且调用应用的DataFrame沿轴的项目数(在本例中为列)与您返回的值数相同,则Pandas将创建返回值中的一个DataFrame,其标签与原始DataFrame相同.您只要执行以下操作即可看到此信息:
>>> def test(row):
return [1, 2, 3]
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df.apply(test, axis=1)
A B C
0 1 2 3
1 1 2 3
2 1 2 3
3 1 2 3
这就是为什么出现错误的原因,因为您无法将DataFrame分配给DataFrame列.
如果返回任何其他数量的值,它将仅返回可以分配的一系列对象:
>>> def test(row):
return [1, 2]
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df.apply(test, axis=1)
0 [1, 2]
1 [1, 2]
2 [1, 2]
3 [1, 2]
>>> df['D'] = df.apply(test, axis=1)
>>> df
A B C D
0 0.333535 0.209745 -0.972413 [1, 2]
1 0.469590 0.107491 -1.248670 [1, 2]
2 0.234444 0.093290 -0.853348 [1, 2]
3 1.021356 0.092704 -0.406727 [1, 2]
我不确定为什么Pandas会这样做,以及为什么仅在返回值是列表或ndarray时才这样做,因为如果返回元组,它不会这样做:
>>> def test(row):
return (1, 2, 3)
>>> df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
>>> df['D'] = df.apply(test, axis=1)
>>> df
A B C D
0 0.121136 0.541198 -0.281972 (1, 2, 3)
1 0.569091 0.944344 0.861057 (1, 2, 3)
2 -1.742484 -0.077317 0.181656 (1, 2, 3)
3 -1.541244 0.174428 0.660123 (1, 2, 3)