【问题标题】:pandas: fill a column with some numpy arrayspandas:用一些 numpy 数组填充一列
【发布时间】:2013-09-09 13:44:23
【问题描述】:

我正在使用 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

用于测试目的的函数:

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

有趣的是,当我从头开始创建数据框时,它运行良好,并且按预期返回:

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]

提前致谢

【问题讨论】:

  • 您应该避免在DataFrames 或Series 中使用lists/tuples。为什么不在 df 中仅使用 3 列,或者在您的列中使用单独的 DataFrame
  • 我猜有时向量形式对于某些数量来说更自然,例如坐标。 df.endPoint-df.startPoint 显然比 np.c_[df.endX-df.startX, df.endY-df.startY, df.endZ-df.startZ] 更可取。

标签: python pandas


【解决方案1】:

如果您尝试从传递给 apply 的函数返回多个值,并且您调用 apply 的 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 为什么这样做,以及为什么它只在返回值为 listndarray 时才这样做,因为如果你返回 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)

【讨论】:

  • 嗨维克多!感谢回答。所以如果我理解正确的话,有没有办法传递一个 numpy 数组?
  • @Nic 如果 numpy 数组的长度与您的代码将起作用的列数不同,但它不打算以这种方式使用。正如 Phillip Cloud 所说,您应该避免在您的系列中放置列表或数组。您应该创建多个系列(即 DataFrame 中的多个列)。
  • 谢谢大家。然后我会听从你的建议,去 3 列。 @Phillip:抱歉,我在初读时错过了您的评论。
  • 我希望在同一个数据框中保留一些数组,我希望有一种支持的方式来做到这一点。
  • 熊猫有什么替代品吗?我不明白不让用户选择他们想要放入数据框中的对象的意义。
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 2016-02-25
  • 1970-01-01
  • 2019-11-24
  • 2021-05-09
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多