如何用Pythonic方式实现Pandas分组条件减法生成新列?
简洁优雅的Pandas实现方案
嘿,这个需求用Pandas的分组+映射操作就能轻松搞定,而且代码简洁可读性强!下面直接上方案和解释:
核心思路
- 按
A列分组,找到每组中B列值最小的行对应的C列值(我们叫它基准值) - 把每个行的
C列值减去对应分组的基准值,得到新列d
实现代码
方法一:字典映射法(可读性拉满)
import pandas as pd # 示例数据 df = pd.DataFrame({ 'A': ['X', 'X', 'Y', 'Y', 'Y'], 'B': [3, 1, 5, 2, 4], 'C': [10, 20, 15, 25, 30] }) # 第一步:计算每个A分组对应的基准值(B最小时的C值) base_values = df.groupby('A').apply(lambda g: g.loc[g['B'].idxmin(), 'C']).to_dict() # 第二步:生成d列 df['d'] = df['C'] - df['A'].map(base_values)
方法二:分组变换法(一行搞定)
如果追求极致简洁,也可以用groupby结合transform,一行代码完成:
df['d'] = df.groupby('A').apply(lambda g: g['C'] - g['C'][g['B'].idxmin()]).reset_index(level=0, drop=True)
示例输出
运行后你的DataFrame会变成这样:
| A | B | C | d |
|---|---|---|---|
| X | 3 | 10 | -10 |
| X | 1 | 20 | 0 |
| Y | 5 | 15 | -10 |
| Y | 2 | 25 | 0 |
| Y | 4 | 30 | 5 |
为什么这两种方法优雅?
- 字典映射法:逻辑清晰,分步操作,新手也能快速理解,而且后续如果需要复用基准值也很方便
- 分组变换法:代码紧凑,利用Pandas的分组变换自动对齐索引,无需额外处理匹配问题
内容的提问来源于stack exchange,提问作者StuckOnDiffyQ
相关产品推荐
相关产品推荐

