python - Pandas Dataframe groupby:一次应用多个 lambda 函数
问题描述
我将以下 pandas 数据框按“名称”分组,然后在“值”上应用几个 lambda 函数以生成其他列。是否可以一次应用这些 lambda 函数以提高效率?
import pandas as pd
df = pd.DataFrame({'name': ['A','A', 'B','B','B','B', 'C','C','C'],
'value': [1, 3, 1, 2, 3, 1, 2, 3, 3], })
df['Diff'] = df.groupby('name')['value'].transform(lambda x: x - x.iloc[0])
df['Count'] = df.groupby('name')['value'].transform(lambda x: x.count())
df['Index'] = df.groupby('name')['value'].transform(lambda x: x.index - x.index[0] + 1)
print(df)
输出:
name value Diff Count Index
0 A 1 0 2 1
1 A 3 2 2 2
2 B 1 0 4 1
3 B 2 1 4 2
4 B 3 2 4 3
5 B 1 0 4 4
6 C 2 0 3 1
7 C 3 1 3 2
8 C 3 1 3 3
解决方案
这是可能GroupBy.apply
与一个功能一起使用,但不确定是否有更好的性能:
def f(x):
a = x - x.iloc[0]
b = x.count()
c = x.index - x.index[0] + 1
return pd.DataFrame({'Diff':a, 'Count':b, 'Index':c})
df = df.join(df.groupby('name')['value'].apply(f))
print(df)
name value Diff Count Index
0 A 1 0 2 1
1 A 3 2 2 2
2 B 1 0 4 1
3 B 2 1 4 2
4 B 3 2 4 3
5 B 1 0 4 4
6 C 2 0 3 1
7 C 3 1 3 2
8 C 3 1 3 3
推荐阅读
- google-apps-script - 如何在特定列中获取下一个空单元格位置,Google Apps 脚本
- kubernetes - kubernetes Client-go kubectl rollout 示例
- arrays - Numpy - 创建视图数组
- vue.js - webpack4 vue 父组件覆盖子组件的样式
- r - 使用 udpipe 和 R 时如何解释专长的值
- c++ - constexpr 变量不是编译时值吗?
- php - 使用 Twig 时三元运算出错
- php - Laravel Echo + VueJS 广播/认证问题
- wso2 - 如何在 WSO2 EI 6.5.0 产品中启用节流机制?
- unity3d - 我试图在我的统一项目中使用 Vuforia,但脚本不起作用