首页 > 解决方案 > 为什么 sum 和 lambda sum 的变换不同?

问题描述

对于数据框:

df = pd.DataFrame({
    'key1': [1,1,1,2,3,np.nan],
    'key2': ['one','two','one', 'three', 'two','one'],
    'data1': [1,2,3,3,4,5]
})

以下使用sum函数的变换不会产生错误:

df.groupby(['key1'])['key1'].transform(sum)

然而,这个变换,也使用sum函数,会产生一个错误:

df.groupby(['key1'])['key1'].transform(lambda x : sum(x))

ValueError: Length mismatch: Expected axis has 5 elements, new values have 6 elements

为什么?

标签: pandaspandas-groupby

解决方案


这可能是一个错误,但是为什么两者行为不同的原因很容易解释为 pandas 在内部覆盖了 builtin summinmax函数。当您将这些函数中的任何一个传递给 pandas 时,它们会在内部被 numpy 等价物替换。

现在,您的石斑鱼有 NaN,并且NaN 被自动排除,如文档所述。正如您在第一条语句中看到的那样,使用任何内置的 pandas agg 函数,这个问题似乎都被处理为自动插入输出中的 NaN。如果你运行,输出是一样的df.groupby(['key1'])['key1'].transform('sum')。但是,当您像在第二个语句中那样传递 lambda 时,无论出于何种原因,都不会使用 NaN 自动替换丢失的输出。

一种可能的解决方法是对字符串进行分组:

df.groupby(df.key1.astype(str))['key1'].transform(lambda x : sum(x))

0    3.0
1    3.0
2    3.0
3    2.0
4    3.0
5    NaN
Name: key1, dtype: float64

这样,NaN 不会被丢弃,并且您摆脱了长度不匹配的问题。


推荐阅读