如何对分组后的DataFrame进行滚动旋转并同步Index?
分组后同步滚动DataFrame行与索引的解决方案
核心是要让分组后的整行数据(含索引列)一起循环滚动,而非仅滚动数值列。之前的问题大概率是只对数值列做了滚动,未同步处理索引列,或滚动后未正确重置每组内部索引。
示例数据构造
先模拟你的场景:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'idx': [1,2,3,4,5,6], 'ValueA': ['a','a','a','b','b','b'], 'ValueB': [10,20,30,40,50,60] })
正确的分组滚动实现
定义滚动函数时,对每组所有列执行循环移位,再重置每组内部默认索引:
def roll_group(group, shift=2): # 对整组数据的行执行循环滚动,shift为正表示向后滚 rolled_data = np.roll(group.values, shift, axis=0) # 重新构造DataFrame并保留原列名 rolled_group = pd.DataFrame(rolled_data, columns=group.columns) # 重置每组内部索引,避免原索引干扰 rolled_group.reset_index(drop=True, inplace=True) return rolled_group # 按ValueA分组后应用滚动函数 result_df = df.groupby('ValueA', group_keys=False).apply(roll_group, shift=2)
结果验证
执行后result_df输出如下,可见每组的idx与ValueB同步向后滚动2位(循环移位):
idx ValueA ValueB 0 2 a 20 1 3 a 30 2 1 a 10 3 5 b 50 4 6 b 60 5 4 b 40
之前方法失败的原因
- 若仅对
ValueB列单独执行shift操作,idx列不会同步移动,必然出现数值与索引脱节。 - 直接对整体结果
reset_index,只会重置全局索引,无法修正每组内的行顺序。
适配find_peaks的提示
滚动完成后,可直接对每组的ValueB列调用scipy.signal.find_peaks——循环移位后边缘峰值会被移至数据中间区域,更便于检测。
内容的提问来源于stack exchange,提问作者J.S.
相关产品推荐
相关产品推荐

