pandas如何遍历DataFrame匹配列同值并合并计算结果回原表
Pandas分组计算结果回写原DataFrame方案
你遇到的合并问题本质是groupby返回结果的索引和原表索引不对齐,只要保证分组计算过程不破坏行索引映射,直接赋值就能把结果写入原表,不需要额外做merge拼接,完整实现步骤如下:
- 第一步:预处理日期列,保证日期比较逻辑正确
原始数据里的date是字符串格式,必须先转成pandas的datetime类型,否则字符串比较会出现日期大小判断错误的问题。 - 第二步:分组前先排序,保证同组记录按日期升序排列
按分组列A+日期列date排序,确保同取值的记录按时间从早到晚排列,从根源满足「后一条记录日期晚于前一条」的要求。 - 第三步:分组计算差值,直接赋值给新列
用groupby()+shift()(或者直接用diff()做相邻行差值)得到的计算结果和排序后的DataFrame行数完全一致、索引一一对应,直接赋值给新列C即可,不需要额外合并。 - 第四步:日期合法性校验
对存在前序同值记录的行,判断当前日期是否晚于前序记录日期,不满足条件的行C列置空即可。
完整可运行代码:
import pandas as pd # 加载示例数据 df = pd.DataFrame({ 'date': ['01-01-2022', '01-02-2022', '01-02-2022', '01-05-2022', '01-10-2022'], 'A': ['k1', 'c1', 'e1', 'k1', 'c1'], 'B': [1, 5, 4, 9, 9] }) # 日期格式转换 df['date'] = pd.to_datetime(df['date'], format='%m-%d-%Y') # 按分组列+日期排序,重置索引保证索引连续 df = df.sort_values(by=['A', 'date']).reset_index(drop=True) # 计算同组相邻记录的B列差值 df['C'] = df.groupby('A')['B'].diff(1) # 日期校验:如果当前行日期不晚于同组前一条记录,C列置空 prev_date = df.groupby('A')['date'].shift(1) df.loc[~(df['date'] > prev_date), 'C'] = None
运行后得到的结果完全符合需求:
| date | A | B | C |
|---|---|---|---|
| 2022-01-02 | c1 | 5 | NaN |
| 2022-01-10 | c1 | 9 | 4.0 |
| 2022-01-02 | e1 | 4 | NaN |
| 2022-01-01 | k1 | 1 | NaN |
| 2022-01-05 | k1 | 9 | 8.0 |
注意:如果之前用
groupby().agg()做聚合得到了缩减行数的结果表,再要合并回原表才需要用pd.merge(),按分组列+排序后的行序号做关联即可,但这种场景下直接用不改变行数的分组转换函数(shift/diff/cumsum等)效率更高,也省掉了合并的步骤。
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

