Pandas数据框架ValueError:传递的值的形状为(X,),索引意味着(X,Y)。

19

我遇到一个错误,但不确定如何修复它。

以下内容似乎有效:

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]

一切似乎正常工作。

这个问题是一个更清晰的方式来问这个问题,我感觉可能有点令人困惑。

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

编辑:我最初使用只有一列的数据框开始。我在四个不同的apply步骤中添加了4列,然后当我尝试添加另一列时,我得到了这个错误。


1
你实际上想要做什么?使用返回列表的函数来使用apply将尝试将其强制转换为Series,因此它需要与原始长度相同的长度,或者是一个标量(包括None)。 - Jeff
你的问题输出结果与apply函数的输出结果不同。在第一种情况下,你的输出结果是一个包含4列的DataFrame,正如@Jeff所说,它被强制转换为行列表。 - Roman Pekar
我正在尝试向数据框中添加一列。这一列将填充计算出的值。计算出的值是从每行的值计算出来的。函数random是计算该值的工具。 - user1367204
@RomanPekar 我认为输出是apply的输出,因为apply会将每一行通过func=random运行,并且该函数将打印出[1,2,3,4]。我不确定你指的是什么。 - user1367204
1
这似乎在pandas的0.16版本中没有发生。 - fixxxer
显示剩余2条评论
2个回答

10
如果您的目标是向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)

但是函数的返回将是一个项目列表。换句话说,“新”列将是一堆列表。我无法让它返回列表。 - user1367204
请问您能否举个例子?您的意思是我应该返回一个元组而不是列表吗?我尝试将 return [1,2,3,4] 替换为 return (1,2,3,4),但仍然出现了相同的错误。 - user1367204
1
这在我的例子上不起作用,因为有一行代码不同。它缺少df ['E'] = 1。我添加了'E'列,然后执行apply。我认为这让它全部失效了。我正在解决的问题始于一个只有一列的数据框,然后我不断地使用apply向数据框添加列。我添加了4列,当我尝试添加第五列时,就会出现错误。 - user1367204
@user1367204 我明白了,有点奇怪。 - Roman Pekar
我的例子在你的机器上能否运行?还是说我的机器有什么问题? - user1367204
显示剩余2条评论

-1

我使用下面的代码,它运行得很好

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

您可以编辑您的答案,提供更多的上下文吗?它是如何解决原问题的?请查看帮助部分,了解如何在此处撰写答案的简介:https://stackoverflow.com/help/answering - Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接