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
相关产品推荐
相关产品推荐

