如何在分组后的Pandas DataFrame中用shift()生成新ID列?
解决Pandas分组后生成特定规则ID列的问题
需求说明
现有Pandas DataFrame,需按Employee和Department分组后生成新列ID,规则如下:
- 组内前n-1行:当前行
ID1与下一行ID2拼接 - 组内最后一行:复制上一行的
ID值
初始数据
import pandas as pd df = pd.DataFrame({'Employee':[5,5,5,20,20], 'Department':[4,4,4,6,6], 'ID1':['AB','CD','EF','XY','AA'], 'ID2':['CD','EF','GH','AA','ZW']})
初始DataFrame:
Employee Department ID1 ID2 0 5 4 AB CD 1 5 4 CD EF 2 5 4 EF GH 3 20 6 XY AA 4 20 6 AA ZW
问题分析
你之前尝试的df2["ID"]=df["ID1"]+df["ID2"].shift(-1)存在两个问题:
- 未按分组处理,
shift(-1)是全局偏移,而非组内偏移 - 未处理最后一行的缺失值(NaN)
解决方案
方法一:分组+自定义函数处理
通过groupby结合apply,对每个分组单独处理:
def process_group(group): # 组内前n-1行:当前ID1 + 下一行ID2 group['ID'] = group['ID1'] + group['ID2'].shift(-1) # 最后一行填充上一行的ID值 group['ID'] = group['ID'].ffill() return group # 分组处理,group_keys=False避免添加分组键索引 df = df.groupby(["Employee", "Department"], group_keys=False).apply(process_group)
方法二:分组+transform简化写法
用transform实现组内偏移,再向前填充缺失值:
# 生成初始ID列(组内最后一行为NaN) df['ID'] = df.groupby(["Employee", "Department"])['ID2'].transform(lambda x: df['ID1'] + x.shift(-1)) # 组内向前填充缺失值 df['ID'] = df.groupby(["Employee", "Department"])['ID'].ffill()
最终输出
Employee Department ID1 ID2 ID 0 5 4 AB CD ABEF 1 5 4 CD EF CDGH 2 5 4 EF GH CDGH 3 20 6 XY AA XYZW 4 20 6 AA ZW XYZW
内容的提问来源于stack exchange,提问作者the phoenix
相关产品推荐
相关产品推荐

