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

Pandas基于DataFrame分组的数据处理:生成PREV_NAME列需求

解决方案:为分组内的记录添加上一条NAME

嘿,我来帮你搞定这个需求!你需要在每个SCHOOL分组内,按照ID的升序顺序,获取上一条记录的NAME作为新列PREV_NAME,分组内第一条记录的PREV_NAME设为None对吧?用Pandas可以轻松实现,咱们看具体步骤:

步骤说明

  1. 确保数据排序正确:先按SCHOOL分组,再按ID升序排列,保证后续偏移操作的顺序是对的。
  2. 分组偏移获取上一条记录:使用groupby('SCHOOL')对数据分组,然后对NAME列调用shift(1)方法,这个方法会把每个分组内的元素向下偏移一位,分组的第一行就会得到NaN。
  3. 替换NaN为None:因为你需要的是None而不是Pandas默认的NaN,所以用replace(np.nan, None)做替换。

完整代码示例

import pandas as pd
import numpy as np

# 构造原始DataFrame
data = {
    'SCHOOL': ['Foo', 'Foo', 'Foo', 'Foo', 'Foo', 'Bar', 'Bar', 'Bar', 'Bar'],
    'ID': [1, 2, 3, 4, 5, 1, 2, 3, 4],
    'SET': [0, 0, 1, 1, 0, 0, 1, 0, 1],
    'NAME': ['Ben', 'Ben', 'Chris', 'Joe', 'Tom', 'Harry', 'Jeff', 'George', 'Tom']
}
df = pd.DataFrame(data)

# 执行操作生成PREV_NAME列
df = df.sort_values(['SCHOOL', 'ID'])  # 确保排序正确,原始数据已经有序,但建议加上保证通用性
df['PREV_NAME'] = df.groupby('SCHOOL')['NAME'].shift(1).replace(np.nan, None)

# 查看结果
print(df)

输出结果

运行后你会得到和预期完全一致的DataFrame:

SCHOOL  ID  SET    NAME PREV_NAME
0    Foo   1    0     Ben      None
1    Foo   2    0     Ben       Ben
2    Foo   3    1   Chris      None
3    Foo   4    1     Joe     Chris
4    Foo   5    0     Tom       Ben
5    Bar   1    0   Harry      None
6    Bar   2    1    Jeff      None
7    Bar   3    0  George     Harry
8    Bar   4    1     Tom      Jeff

这里要注意,如果你的原始数据已经按SCHOOL和ID排好序了,sort_values这一步可以省略,但加上它能让代码更健壮,避免因为原始数据顺序混乱导致结果出错。

内容的提问来源于stack exchange,提问作者rwolst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:08