Pandas Dataframe ValueError:传递值的形状是(X,),索引暗示(X,Y)

时间:2013-10-29 18:59:31

标签: python-2.7 pandas ipython dataframe

我收到错误,我不确定如何修复它。

以下似乎有效:

def random(row):
   return [1,2,3,4]

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))

df.apply(func = random, axis = 1)

我的输出是:

[1,2,3,4]
[1,2,3,4]
[1,2,3,4]
[1,2,3,4]

但是,当我将其中一列更改为1或None之类的值时:

def random(row):
   return [1,2,3,4]

df = pandas.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))
df['E'] = 1

df.apply(func = random, axis = 1)

我收到错误:

ValueError: Shape of passed values is (5,), indices imply (5, 5)

我已经和它搏斗了几天,似乎什么都没有用。有趣的是,当我改变时

def random(row):
   return [1,2,3,4]

def random(row):
   print [1,2,3,4]
一切似乎都正常。

这个问题是asking this question的更清晰的方式,我觉得这可能让人感到困惑。

我的目标是为每一行计算一个列表,然后创建一列。

编辑:我最初是从一个拥有一列的数据框开始的。我在4个不同的应用步骤中添加4列,然后当我尝试添加另一列时,我收到此错误。

2 个答案:

答案 0 :(得分:8)

如果您的目标是向DataFrame添加新列,只需将函数编写为返回标量值(不是列表)的函数,如下所示:

>>> def random(row):
...     return row.mean()

然后使用apply:

>>> df['new'] = df.apply(func = random, axis = 1)
>>> df
          A         B         C         D       new
0  0.201143 -2.345828 -2.186106 -0.784721 -1.278878
1 -0.198460  0.544879  0.554407 -0.161357  0.184867
2  0.269807  1.132344  0.120303 -0.116843  0.351403
3 -1.131396  1.278477  1.567599  0.483912  0.549648
4  0.288147  0.382764 -0.840972  0.838950  0.167222

我不知道您的新列是否可能包含列表,但是它几乎可以包含元组((...)而不是[...]):

>>> def random(row):
...    return (1,2,3,4,5)
...
>>> df['new'] = df.apply(func = random, axis = 1)
>>> df
          A         B         C         D              new
0  0.201143 -2.345828 -2.186106 -0.784721  (1, 2, 3, 4, 5)
1 -0.198460  0.544879  0.554407 -0.161357  (1, 2, 3, 4, 5)
2  0.269807  1.132344  0.120303 -0.116843  (1, 2, 3, 4, 5)
3 -1.131396  1.278477  1.567599  0.483912  (1, 2, 3, 4, 5)
4  0.288147  0.382764 -0.840972  0.838950  (1, 2, 3, 4, 5)

答案 1 :(得分:-1)

我使用下面的代码就好了

import numpy as np    
df = pd.DataFrame(np.array(your_data), columns=columns)