pandas:用一些numpy数组填充一列

Nic*_*Nic 11 python pandas

我使用的是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)

  • 我希望在同一个数据帧中保留一些数组,我希望有一种支持的方法来做到这一点. (3认同)