如何在Python的DataFrame中基于列值生成重复行并枚举/计算
SAS转Python:基于列值分组生成枚举列与日期差列
原始数据结构
| ID | TYPE | DATE |
|---|---|---|
| 1 | A | 20200101 |
| 1 | B | 20200103 |
| 2 | A | 20200105 |
| 2 | A | 20200107 |
| 2 | B | 20200108 |
期望输出要求
需新增两个列:
SEQ:同一ID+TYPE组合内的行号,从1开始递增DIFF:当前行DATE与对应ID下TYPE=A的最小DATE的天数差
Python(Pandas)实现代码
import pandas as pd # 读取并预处理数据(根据实际数据源调整读取方式) df = pd.read_csv('your_data.csv') # 将DATE列转为标准日期格式 df['DATE'] = pd.to_datetime(df['DATE'], format='%Y%m%d') # 生成SEQ列:按ID和TYPE分组计数 df['SEQ'] = df.groupby(['ID', 'TYPE']).cumcount() + 1 # 生成DIFF列:先获取每个ID的TYPE=A基准日期,再计算天数差 base_dates = df[df['TYPE'] == 'A'].groupby('ID')['DATE'].min().reset_index(name='BASE_DATE') df = df.merge(base_dates, on='ID', how='left') df['DIFF'] = (df['DATE'] - df['BASE_DATE']).dt.days # 可选:删除临时基准日期列 df.drop('BASE_DATE', axis=1, inplace=True) # 查看最终结果 print(df)
关键逻辑说明
groupby(['ID', 'TYPE']).cumcount() +1:针对每个ID和TYPE的组合分组,从0开始的计数加1后得到从1起始的序列编号。- 基准日期提取:先筛选TYPE=A的行,按ID分组取最小DATE,再通过
merge将基准日期匹配到对应ID的所有行。 - 日期差计算:利用Pandas日期类型的减法特性,
dt.days将时间差转换为整数天数。
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

