You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

运行后得到的结果完全符合需求:

dateABC
2022-01-02c15NaN
2022-01-10c194.0
2022-01-02e14NaN
2022-01-01k11NaN
2022-01-05k198.0

注意:如果之前用groupby().agg()做聚合得到了缩减行数的结果表,再要合并回原表才需要用pd.merge(),按分组列+排序后的行序号做关联即可,但这种场景下直接用不改变行数的分组转换函数(shift/diff/cumsum等)效率更高,也省掉了合并的步骤。

内容的提问来源于stack exchange,提问作者Val

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.11 16:16:22