这个问题源于this comment thread。使用熊猫0.20.3
。你知道吗
我试图理解apply()
操作抛出错误的原因:
ValueError: Wrong number of items passed 2, placement implies 1
Pandas ValueError
的这种特殊风格是notuncommon,但它通常来自一种更明显的尝试,即将一堆元素塞进为较小容量而设计的数据结构中。这里肯定也发生了同样的事情,但我不知道为什么。你知道吗
给定一个包含整数列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]
我本以为我会得到同样的错误,只是用Wrong number of items passed 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
考虑到所有这些不同的情况,我不明白placement implies 1
指的是什么,为什么我不能用这种方法在C
中列出A
和B
的元素。
我怎么会误解这个错误信息呢?你知道吗
这种行为似乎是由试图提供帮助的(a)
.apply()
和滥用.apply()
作为输出非标量值的一种手段的混合结果。它已在熊猫版本0.21
中修复。你知道吗我已经从Github的各种问题页面[1,2,3]中拼凑出了这个解释,其中一些页面也链接到了inthis answer。这并不能真正解释为什么在实现层会发生这种情况,但至少从实质上回答了这个问题。
乐意接受任何相关的更新/编辑。你知道吗
试图提供帮助:
如果返回的多维值与输入数据帧具有相同的形状,
apply
将推断数据帧作为输出:滥用
.apply()
作为输出非标量值的手段:简而言之,如果你能避免的话,就不要这样做。如果你必须的话,偶尔期待一些有趣的结果。你知道吗
相关问题 更多 >
编程相关推荐