pandas - 为什么 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
为什么?
解决方案
这可能是一个错误,但是为什么两者行为不同的原因很容易解释为 pandas 在内部覆盖了 builtin sum
、min
和max
函数。当您将这些函数中的任何一个传递给 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 不会被丢弃,并且您摆脱了长度不匹配的问题。
推荐阅读
- javascript - 带有文本功能的简单jquery图像编辑器
- ruby - 为什么 Module#define_method 忽略方法命名“规则”
- awk - 根据特定列中的数据输出文件
- javascript - 适当地使用 onClick
- mysql - 更改 MariaDB 排序规则不适用于实时机器,但适用于本地机器
- arrays - 对模块内的 numpy 数组进行的操作会影响模块外的变量
- nfc - 这是哪个NFC标签?nfc-list Mifare Ultralight/Classic 7Byte UID
- python - 在 opecv python 中处理 4 个不同的视频源
- data-binding - 当页面上的自定义视图中发生属性更改时如何调用页面方法背后的代码
- ios - 为什么在 Swift 中使用来自 Firestore 的侦听器获取数据时仍然会删除文档?