当返回的列表长度与数据帧列数相同时,apply+list会给出ValueError

2024-03-29 11:37:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题源于this comment thread。使用熊猫0.20.3。你知道吗

我试图理解apply()操作抛出错误的原因:

ValueError: Wrong number of items passed 2, placement implies 1

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

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

import pandas as pd

df = pd.DataFrame({'A': [1,2], 'B': [3,4]})
df
   A  B
0  1  3
1  2  4

我可以构造一个新列C,它是一列列表。
C中的每个列表都包含来自AB的值。
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中列出AB的元素。
我怎么会误解这个错误信息呢?你知道吗


Tags: oflambdainnumberdf列表for错误
1条回答
网友
1楼 · 发布于 2024-03-29 11:37:42

这种行为似乎是由试图提供帮助的(a).apply()和滥用.apply()作为输出非标量值的一种手段的混合结果。它已在熊猫版本0.21中修复。你知道吗

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

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

TomAugspurger: DataFrame.apply tries to infer an output based on the result. The result of your output is inferred to be a DataFrame with the same columns. [ref]

jreback: The issue is .apply has to try to figure out what you are returning and how that maps to the starting data. [ref]

滥用.apply()作为输出非标量值的手段:
简而言之,如果你能避免的话,就不要这样做。如果你必须的话,偶尔期待一些有趣的结果。你知道吗

jreback: Note that returning non-scalars is generally not recommended and is not efficiently supported. [ref]

相关问题 更多 >