Pandas基于DataFrame分组的数据处理:生成PREV_NAME列需求
解决方案:为分组内的记录添加上一条NAME
嘿,我来帮你搞定这个需求!你需要在每个SCHOOL分组内,按照ID的升序顺序,获取上一条记录的NAME作为新列PREV_NAME,分组内第一条记录的PREV_NAME设为None对吧?用Pandas可以轻松实现,咱们看具体步骤:
步骤说明
- 确保数据排序正确:先按
SCHOOL分组,再按ID升序排列,保证后续偏移操作的顺序是对的。 - 分组偏移获取上一条记录:使用
groupby('SCHOOL')对数据分组,然后对NAME列调用shift(1)方法,这个方法会把每个分组内的元素向下偏移一位,分组的第一行就会得到NaN。 - 替换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
相关产品推荐
相关产品推荐

