为什么sum和lambda sum在转换中有所不同?

时间:2018-08-11 22:14:33

标签: pandas pandas-groupby

对于数据框:

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

为什么?

1 个答案:

答案 0 :(得分:2)

这可能是一个错误,但是熊猫内部在内部覆盖内置的summinmax函数的事实很容易解释了两者行为不同的原因。 。当您将任何这些函数传递给pandas时,它们会在内部被numpy等效项取代。

现在,您的石斑鱼有NaN和NaNs are automatically excluded,如文档所述。使用任何内置的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,并且您可以摆脱长度不匹配的情况。