如何基于DataFrame列的递增连续序列创建分组?
解决DataFrame按连续递增/相等规则分组的问题
问题说明
给定以下DataFrame:
import pandas as pd df = pd.DataFrame( { 'a': [10, 14, 20, 10, 12, 5, 3] } )
需要按照从上到下,只要列a的值递增或相等则分组不变;当当前行a的值小于前一行时,切换新分组的规则,将数据拆分为4个分组,预期输出如下:
a 0 10 1 14 2 20 a 3 10 4 12 a 5 5 a 6 3
用户尝试了以下代码,但不知道后续步骤:
import numpy as np df['dir'] = np.sign(df.a.shift(-1) - df.a)
解决方案
核心思路是标记分组切换的节点,生成分组ID后拆分输出:
完整代码
import pandas as pd import numpy as np # 原始数据 df = pd.DataFrame({'a': [10, 14, 20, 10, 12, 5, 3]}) # 生成分组ID:当当前行a小于前一行时,分组ID+1 df['group_id'] = (df['a'] < df['a'].shift()).cumsum() # 遍历分组并输出 for group_id in df['group_id'].unique(): # 只保留a列,匹配预期输出格式 current_group = df[df['group_id'] == group_id][['a']] print(current_group) print() # 空行分隔不同分组
代码解释
- 标记分组切换点:
df['a'] < df['a'].shift()生成布尔序列,True表示当前行a的值小于前一行,这就是分组需要切换的位置。 - 生成分组ID:对布尔序列使用
cumsum()累加(布尔值会被转为1/0),这样每个切换点之后的行会自动获得新的分组ID。 - 拆分并输出:遍历所有唯一的分组ID,筛选对应行并只保留a列,输出时用空行分隔分组,完全匹配预期格式。
对用户尝试代码的补充
你之前用np.sign(df.a.shift(-1)-df.a)是比较当前行和下一行的关系,但规则是基于当前行和前一行的比较,所以方向反了,调整为和前一行的对比即可实现需求。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

