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

如何在分组后的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)存在两个问题:

  1. 未按分组处理,shift(-1)是全局偏移,而非组内偏移
  2. 未处理最后一行的缺失值(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:25:18