如何使用Python对DataFrame按ID分组计算历史T1累加值与T1=2的次数
实现方案
直接用pandas内置的分组、累计求和、移位操作即可实现需求,无需复杂自定义函数,完整代码如下:
import pandas as pd # 构造原表测试数据 data = { "s/n": [0, 1, 2, 3, 4, 5, 6, 7, 8], "i.d": ["A", "B", "C", "A", "B", "C", "A", "B", "C"], "T1": [2, 2, 0, 2, 0, 2, 1, 0, 1] } df = pd.DataFrame(data) # 计算同分组当前行之前的T1累计和 # 逻辑:组内先累计求和,结果下移1行,空值(每组第一行)填0后转整数 df["prev_total_T1"] = df.groupby("i.d")["T1"].cumsum().shift(1).fillna(0).astype(int) # 计算同分组当前行之前T1=2的累计次数 # 先标记T1等于2的行,再按分组累计计数后移位、补0 df["t1_equals_2"] = df["T1"] == 2 df["prev_no_of_T1_2"] = df.groupby("i.d")["t1_equals_2"].cumsum().shift(1).fillna(0).astype(int) # 删除计算用的中间标记列 df = df.drop("t1_equals_2", axis=1) # 输出结果 print(df)
运行后输出的结果和你给出的目标表结构完全一致。
逻辑说明
groupby("i.d"):按i.d字段拆分独立分组,所有计算仅在同分组内生效cumsum():累计求和/计数,默认会包含当前行的数值shift(1):将累计结果向下偏移1行,使当前行拿到的是前面所有行的累计结果fillna(0):每个分组的第一行偏移后会产生空值,替换为0符合初始无历史数据的需求
内容的提问来源于stack exchange,提问作者Pat rick
相关产品推荐
相关产品推荐

