如何按指定列连续重复值范围合并pandas DataFrame并生成pos起止区间
pandas连续相同行合并区间实现方案
原代码问题说明
你原来的写法使用全局去重逻辑duplicated,只会识别所有A、B列取值组合唯一的行,不会判断行是否连续,一旦后续重复出现之前出现过的A、B组合,就会被错误合并到最早的同组合分组中,完全不符合连续行合并的需求。
正确实现代码
import pandas as pd # 生成测试DataFrame test_df = pd.DataFrame({'pos' : [x for x in range(10)], 'A' : ['foo' for x in range(5)] + ['bar' for x in range(5)], 'B' : ['foo' for x in range(3)] + ['bar' for x in range(7)]}) # 生成连续相同A/B的分组标签:当前行和上一行A/B有一个不同就新开一个分组 test_df['group_id'] = ((test_df['A'] != test_df['A'].shift()) | (test_df['B'] != test_df['B'].shift())).cumsum() # 按分组聚合得到起止区间 result = test_df.groupby('group_id', as_index=False).agg( start = ('pos', 'min'), # 完全匹配你给出的预期输出:非最后一组取左闭右开的右边界,最后一组取最大pos值 stop = ('pos', lambda x: x.max() + 1 if x.name != test_df['group_id'].max() else x.max()), A = ('A', 'first'), B = ('B', 'first') ).drop(columns='group_id') print(result)
运行输出结果
start stop A B 0 0 3 foo foo 1 3 5 foo bar 2 5 9 bar bar
和你给出的预期结果完全一致。如果后续需要统一使用左闭右开区间,只需要把stop的聚合逻辑改成lambda x: x.max()+1即可。
内容的提问来源于stack exchange,提问作者curious
相关产品推荐
相关产品推荐

