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

基于不同行和列的减法函数:DataFrame分组新增列实现需求

解决方案:用Pandas实现分组内的差值计算

没问题,我来帮你搞定这个需求!咱们用Pandas就能轻松实现,完全匹配你要的逻辑,步骤清晰,我给你一步步拆解:

完整代码示例

import pandas as pd

# 1. 构造你的示例数据集
data = {
    'ROW': [1, 2, 3, 4, 5, 6],
    'ID': ['A', 'A', 'B', 'A', 'B', 'B'],
    'ORDER': [1, 1, 1, 2, 2, 2],
    'START': [0, 2, 0, 4, 2, 6],
    'FINISH': [1, 4, 2, 5, 5, 8]
}
df = pd.DataFrame(data)

# 2. 按要求先排序:优先按ORDER,再按ID
df_sorted = df.sort_values(by=['ORDER', 'ID']).reset_index(drop=True)

# 3. 计算NEW列:分组内当前START - 上一行FINISH,分组变化时自动返回NaN
df_sorted['NEW'] = df_sorted['START'] - df_sorted.groupby(['ORDER', 'ID'])['FINISH'].shift(1)

# 可选:重新生成ROW列(如果需要排序后的连续行号)
df_sorted['ROW'] = df_sorted.index + 1

print(df_sorted)

输出结果

运行后你会得到完全符合预期的结果:

ROW ID  ORDER  START  FINISH  NEW
0    1  A      1      0       1  NaN
1    2  A      1      2       4  1.0
2    3  B      1      0       2  NaN
3    4  A      2      4       5  NaN
4    5  B      2      2       5  NaN
5    6  B      2      6       8  1.0

关键逻辑解释

  • 排序:sort_values(by=['ORDER', 'ID'])确保数据先按ORDER分组,同ORDER内再按ID分组,这是后续计算的基础。
  • 分组移位计算:groupby(['ORDER', 'ID'])['FINISH'].shift(1)会把每个(ORDER, ID)组内的FINISH值向上移动一行——组内第一行没有上一行数据,所以结果是NaN(对应你要的NA);同一组内的后续行,会取上一行的FINISH值。
  • 差值计算:用当前行的START减去移位后的FINISH值,完美实现你要的逻辑:同一组内计算差值,ORDER或ID变化时自动返回NA。

如果你的原始ROW列需要保留原来的编号,只需要去掉reset_index(drop=True)和重新生成ROW的步骤即可,排序后原始ROW列会保留,但行顺序会调整为按ORDER和ID排序后的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:49