Python pandas 按A列分组时遇D列新序列中断实现分段groupby聚合
问题根因
你之前直接用['A','D']作为groupby键的写法,会把同一个A值下所有D值相同的行全部聚合,完全忽略D值是否连续。比如A=04547下D=1000000的行分别出现在7-8月、10月24日两个不连续的区间,就会被错误合并成一组,自然和预期结果不符。
实现方案
核心是先给每个A分组内的连续相同D值段生成独立的分段ID,再用A+分段ID作为分组键做聚合即可:
- 按A列拆分数据,对每个拆分后的子集,逐行判断当前行D值和上一行D值是否不同,每出现一次不同就给分段ID+1,相同则沿用当前分段ID
- 基于A列和生成的分段ID做分组聚合,按要求取B列首值、C列末值、D列首值即可
可直接运行的代码
# 注意:如果你的A列带前导0,读取数据时请指定dtype={'A': str},避免前导0被自动转成整数丢失 # 生成连续段标记 df['seg_flag'] = df.groupby('A')['D'].apply(lambda x: (x != x.shift()).cumsum()).droplevel(0) # 聚合得到结果 result = df.groupby(['A', 'seg_flag'], as_index=False).agg( B=('B', 'first'), C=('C', 'last'), D=('D', 'first') ).drop(columns='seg_flag')
运行上述代码后输出的结果和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Glammy
相关产品推荐
相关产品推荐

