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

Posted

技术标签:

【中文标题】Pandas Dataframe ValueError:传递值的形状是(X,),索引暗示(X,Y)【英文标题】:Pandas Dataframe ValueError: Shape of passed values is (X, ), indices imply (X, Y) 【发布时间】:2013-11-09 02:53:38 【问题描述】:

我收到一个错误,我不知道如何解决它。

以下似乎有效:

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 或无之类的值时:

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 列,然后当我尝试添加另一列时出现此错误。

【问题讨论】:

你到底想做什么?将 apply 与返回列表的函数一起使用将尝试将其强制为系列,因此它需要与原始长度相同的长度,或者一个标量(包括无)。 您的问题中的输出不是您从应用中得到的。在第一种情况下,您的输出是具有 4 列的 DataFrame,正如@Jeff 所说,它被强制列表成行。 我正在尝试向数据框添加一列。此列将填充计算值。计算值是根据每一行的值计算的。函数 random 是计算值的东西。 @RomanPekar 我认为输出是 apply 的输出,因为 apply 将通过 func=random 运行每一行,并且该 func 将打印出 [1,2,3,4]。我不确定你在指出什么。 这在 0.16 版本的 pandas 中似乎没有发生 【参考方案1】:

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

【讨论】:

但是函数的返回将是一个项目列表。换句话说,“新”列是一堆列表。我无法让它与返回列表一起使用。 你能举个例子吗?你的意思是我应该返回一个元组而不是一个列表?我尝试将 return [1,2,3,4] 切换为 return (1,2,3,4) 并得到相同的错误。 这不适用于我的示例,因为有一行代码不同。它缺少 df['E'] = 1。我添加了列 'E' 然后我申请了。我认为这一切都被抛弃了。我正在处理的问题从一个具有一列的数据框开始,然后我继续申请数据框以添加列。我添加了 4 列,然后当我尝试添加第五列时,我得到了那个错误。 @user1367204 我明白了,奇怪 我的示例是否适用于您的机器,还是我的机器有问题?【参考方案2】:

我用下面的代码就可以了

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

【讨论】:

您能否编辑您的答案以提供更多背景信息?它如何解决原来的问题?请参阅帮助部分,了解如何在此处编写答案:***.com/help/answering

以上是关于Pandas Dataframe ValueError:传递值的形状是(X,),索引暗示(X,Y)的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

python pandas dataframe 写入hdfs

pandas怎么选取dataframe中几列

详解pandas获取Dataframe元素值的几种方法