Python 应用+;当返回的列表长度与数据帧列数相同时,列表理解给出ValueError

Python 应用+;当返回的列表长度与数据帧列数相同时,列表理解给出ValueError,python,pandas,Python,Pandas,这个问题是由我们自己提出的。使用熊猫0.20.3 我试图理解为什么apply()操作会抛出错误: ValueError:传递的项目数错误2,放置意味着1 PandasValueError的这种特殊风格是,但它通常来自一种更明显的尝试,即将一组元素塞进一个设计用于较小容量的数据结构中。这里肯定发生了同样的事情,但我不明白为什么 给定一个包含整数列a和B的数据帧: import pandas as pd df = pd.DataFrame({'A': [1,2], 'B': [3,4]}) df

这个问题是由我们自己提出的。使用熊猫
0.20.3

我试图理解为什么
apply()
操作会抛出错误:

ValueError:传递的项目数错误2,放置意味着1

Pandas
ValueError
的这种特殊风格是,但它通常来自一种更明显的尝试,即将一组元素塞进一个设计用于较小容量的数据结构中。这里肯定发生了同样的事情,但我不明白为什么

给定一个包含整数列
a
B
的数据帧:

import pandas as pd

df = pd.DataFrame({'A': [1,2], 'B': [3,4]})
df
   A  B
0  1  3
1  2  4
我可以构造一个新列,
C
,它是一列列表。
C
中的每个列表都包含
A
B
中的值
C
应该是:

     C
[1, 3]
[2, 4]
我选择使用
apply()
和一个列表来构建
C

df['C'] = df.apply(lambda x: [val for val in x], axis=1)
(目前,请忽略这样一种可能性,即这不是实现这一目标的最优雅的方式——这主要是一条通向我所困惑的错误的途径。)

这会抛出上面提到的
ValueError

但是,我可以毫不费力地创建每行包含更多项目的列表:

df['C'] = df.apply(lambda x: [val for val in x]+[1], axis=1)
df
   A  B          C
0  1  3  [1, 3, 1]
1  2  4  [2, 4, 1]
我本以为我也会遇到同样的错误,只是传递了
错误数量的项目3…
而不是
2

我还可以用较少的项目创建
C

df['C'] = df.apply(lambda x: [val for val in x][:1], axis=1)
df
   A  B    C
0  1  3  [1]
1  2  4  [2]
此外,
C
在第一行的列表长度小于或大于
[1,3]
时生成,但在第一行的列表长度与
len([1,3])
匹配时失败,即使后续列表长度不同:

df['C'] = df.apply(lambda x: [val for val in x if val != 1], axis=1) # this works
df['C'] = df.apply(lambda x: [val for val in x if val != 4], axis=1) # this fails
考虑到所有这些不同的情况,我不明白
位置意味着1
指的是什么,以及为什么我不能用这种方法在
C
中列出
A
B
的元素。

我是如何误解此错误消息的?

似乎此行为是由试图提供帮助的
.apply()
和滥用
.apply()
作为输出非标量值的手段的混合结果。它已在Pandas版本
0.21
中修复

我从各种Github问题页面[,]中拼凑出了这一解释,其中一些页面也链接到了中。这并不能真正解释为什么会在实现级别发生这种情况,但至少从实质上回答了这个问题。
乐意接受任何相关的更新/编辑

.apply()
尝试提供帮助:

如果返回的多维值与输入数据帧具有相同的形状,
apply
将推断数据帧作为输出:

Tomaugsurger:DataFrame.apply尝试根据结果推断输出。输出的结果被推断为具有相同列的数据帧

jreback:问题是。apply必须尝试找出返回的内容,以及这些内容如何映射到起始数据

滥用
.apply()
作为输出非标量值的手段:

简言之,如果你能避免,就不要这样做。如果你必须的话,偶尔也会期待有趣的结果

jreback:请注意,通常不建议返回非标量,也不支持高效返回


这种行为似乎是由试图提供帮助的(a)
.apply()
和滥用
.apply()
作为输出非标量值的一种手段而导致的。它已在Pandas版本
0.21
中修复

我从各种Github问题页面[,]中拼凑出了这一解释,其中一些页面也链接到了中。这并不能真正解释为什么会在实现级别发生这种情况,但至少从实质上回答了这个问题。
乐意接受任何相关的更新/编辑

.apply()
尝试提供帮助:
如果返回的多维值与输入数据帧具有相同的形状,
apply
将推断数据帧作为输出:

Tomaugsurger:DataFrame.apply尝试根据结果推断输出。输出的结果被推断为具有相同列的数据帧

jreback:问题是。apply必须尝试找出返回的内容,以及这些内容如何映射到起始数据

滥用
.apply()
作为输出非标量值的手段:

简言之,如果你能避免,就不要这样做。如果你必须的话,偶尔也会期待有趣的结果

jreback:请注意,通常不建议返回非标量,也不支持高效返回


我无法在
0.21
上复制此内容。但是我可以告诉你,pandas特殊情况列表和numpy数组与数据帧具有相同的宽度。这也是你可以做
df.apply(tuple,1)
但不做
df.apply(list,1)
有趣的原因。你能告诉我“特殊情况”在哪里吗讨论的是什么?我认为最相关的链接是:在我尝试之后,
df.apply(lambda x:[val for val in x if val!=2],axis=1)
,我感到震惊…我无法在
0.21
上重现这一点。但是我可以告诉你,pandas特殊情况列表和numpy数组与数据帧具有相同的宽度。这也是你可以做
df.apply(tuple,1)
但不做
df.apply(list,1)
有趣的原因。你能告诉我“特殊情况”在哪里吗事情已经讨论过了?我认为最相关的链接应该是:在我尝试之后,
df.apply(lambda x:[val for val in x if val!=2],axis=1)
,我感到震惊。。。