基于不同行和列的减法函数: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
相关产品推荐
相关产品推荐

