如何使用pandas groupby实现排除当前行的两列比值计算并生成新列
正确实现方式
你可以先用transform计算每个分组的列总和,再基于每行的数值做差值计算,该方法比逐行apply的性能更高,适合大数据量场景:
import pandas as pd df = pd.DataFrame({'Group':['A', 'A', 'A', 'B', 'B'], 'Col_1':[100, 200, 300, 400, 500], 'Col_2':[55, 66, 77, 88, 99]}) # 计算每个分组下Col_1、Col_2的总和,返回和原DataFrame长度一致的结果 group_col1_sum = df.groupby('Group')['Col_1'].transform('sum') group_col2_sum = df.groupby('Group')['Col_2'].transform('sum') # 按规则计算比值 df['Div_excl'] = (group_col2_sum - df['Col_2']) / (group_col1_sum - df['Col_1'])
计算后得到的df结果如下:
| Group | Col_1 | Col_2 | Div_excl |
|---|---|---|---|
| A | 100 | 55 | 0.286000 |
| A | 200 | 66 | 0.330000 |
| A | 300 | 77 | 0.403333 |
| B | 400 | 88 | 0.198000 |
| B | 500 | 99 | 0.220000 |
原代码错误原因
- 你在lambda表达式中调用
df['Col_2'].sum()、df['Col_1'].sum(),计算的是整个数据集的列总和,而非当前分组的列总和,逻辑不符合需求。 - lambda的入参x是当前分组的完整DataFrame,直接用总和减去x会出现维度不匹配的问题,无法得到逐行的计算结果。
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

