对于数据框:
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
为什么?
答案 0 :(得分:2)
这可能是一个错误,但是熊猫内部在内部覆盖内置的sum
,min
和max
函数的事实很容易解释了两者行为不同的原因。 。当您将任何这些函数传递给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,并且您可以摆脱长度不匹配的情况。