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
PandasValueError
的这种特殊风格是,但它通常来自一种更明显的尝试,即将一组元素塞进一个设计用于较小容量的数据结构中。这里肯定发生了同样的事情,但我不明白为什么
给定一个包含整数列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)
,我感到震惊。。。