基于Pandas DataFrame按GROUP列(忽略末尾H)生成CAL求和列
解决Pandas中按GROUP前缀(去除末尾H)求和生成CAL列的问题
这问题我之前也碰到过,用分组加映射的方式就能轻松解决,来看具体步骤:
完整实现代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'ORDER':["A", "A", "A", "B", "B","B"], 'GROUP': ["A_2018_1B1", "A_2018_1B1H", "A_2018_1M1", "B_2018_I000_1C1", "B_2018_I000_1B1", "B_2018_I000_1C1H"], 'VAL':[1,3,8,5,8,10]}) # 生成匹配分组的key:移除GROUP末尾可能的'H'字符 df['group_key'] = df['GROUP'].apply(lambda x: x[:-1] if x.endswith('H') else x) # 按分组key求和,再映射回原DataFrame得到CAL列 df['CAL'] = df['group_key'].map(df.groupby('group_key')['VAL'].sum()) # 可选:删除中间生成的group_key列 df = df.drop('group_key', axis=1) print(df)
代码解释
- 生成分组Key:通过
apply和lambda函数处理GROUP列,将所有以H结尾的字符串去掉最后一位,这样A_2018_1B1和A_2018_1B1H会被归为同一个分组Key,B_2018_I000_1C1和B_2018_I000_1C1H同理。 - 分组求和映射:先按
group_key分组对VAL列求和,得到每个分组的总和,再用map方法把这个总和对应到每一行,就生成了需要的CAL列。 - 清理中间列:如果不需要中间的
group_key列,用drop方法删掉即可。
输出结果
| 序号 | ORDER | GROUP | VAL | CAL |
|---|---|---|---|---|
| 0 | A | A_2018_1B1 | 1 | 4 |
| 1 | A | A_2018_1B1H | 3 | 4 |
| 2 | A | A_2018_1M1 | 8 | 8 |
| 3 | B | B_2018_I000_1C1 | 5 | 15 |
| 4 | B | B_2018_I000_1B1 | 8 | 8 |
| 5 | B | B_2018_I000_1C1H | 10 | 15 |
内容的提问来源于stack exchange,提问作者Shanoo
相关产品推荐
相关产品推荐

