我使用的是python2.7和pandas 0.11.0.
我尝试使用DataFrame.apply(func)填充数据框的列.func()函数应该返回一个numpy数组(1x3).
import pandas as pd
import numpy as np
df= pd.DataFrame(np.random.randn(4, 3), columns=list('ABC'))
print(df)
A B C
0 0.910142 0.788300 0.114164
1 -0.603282 -0.625895 2.843130
2 1.823752 -0.091736 -0.107781
3 0.447743 -0.163605 0.514052
Run Code Online (Sandbox Code Playgroud)
用于测试目的的功能:
def test(row):
# some complex calc here
# based on the values from different columns
return np.array((1,2,3))
df['D'] = df.apply(test, axis=1)
[...]
ValueError: Wrong number of items passed 1, indices imply 3
Run Code Online (Sandbox Code Playgroud)
有趣的是,当我从头开始创建数据框时,它工作得很好,并按预期返回:
dic = {'A': {0: 0.9, 1: -0.6, 2: 1.8, 3: 0.4},
'C': {0: 0.1, 1: 2.8, 2: -0.1, 3: 0.5},
'B': {0: 0.7, 1: -0.6, 2: -0.1, 3: -0.1},
'D': {0:np.array((1,2,3)),
1:np.array((1,2,3)),
2:np.array((1,2,3)),
3:np.array((1,2,3))}}
df= pd.DataFrame(dic)
print(df)
A B C D
0 0.9 0.7 0.1 [1, 2, 3]
1 -0.6 -0.6 2.8 [1, 2, 3]
2 1.8 -0.1 -0.1 [1, 2, 3]
3 0.4 -0.1 0.5 [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
提前致谢
Vik*_*kez 11
如果您尝试从传递给的函数返回多个值apply,并且调用applyon 的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
Run Code Online (Sandbox Code Playgroud)
这就是您收到错误的原因,因为您无法将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]
Run Code Online (Sandbox Code Playgroud)
我不确定为什么Pandas 会这样做,以及为什么只有当返回值是a list或a时才ndarray会这样做,因为如果你返回一个,它就不会这样做tuple:
>>> 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16523 次 |
| 最近记录: |