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

Pandas中如何通过GroupBy对整组执行非聚合操作生成相邻序列对?

解决方案

你可以直接利用Pandas的groupby结合shift方法实现,这是完全向量化的操作,比循环快几个数量级,步骤如下:

1. 确保数据按分组和时间顺序排列

虽然你的示例数据已经有序,但实际场景中datetime列可能需要先排序,避免顺序错乱:

# 按person和day(实际为datetime列)排序,保证每组内的时序正确
df_seq = df_seq.sort_values(['person', 'day']).reset_index(drop=True)

2. 生成相邻食物列food_next

利用groupby后调用shift(-1),可以在每个person组内将food列向下偏移一行,得到下一个时段的食物:

# 按person分组,对food列执行shift(-1),获取每组内的下一个食物
df_seq['food_next'] = df_seq.groupby('person')['food'].shift(-1)

3. 过滤掉无后续食物的行

每组的最后一行没有下一个食物,对应的food_next为NaN,直接过滤即可:

# 丢弃food_next为NaN的行,得到最终结果
result = df_seq.dropna(subset=['food_next']).reset_index(drop=True)

运行后得到的result就是你想要的输出:

person  day      food food_next
0    Tom    1      beef      lamb
1    Tom    2      lamb   chicken
2   Lucy    1      fish      pork
3   Lucy    4      pork   venison

补充:用apply的实现方式(效率略低)

如果一定要用apply,可以在每组内生成偏移列后过滤,但性能不如直接的groupby+shift:

result = df_seq.groupby('person', group_keys=False).apply(
    lambda x: x.assign(food_next=x['food'].shift(-1)).dropna()
).reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:55:18