Python pandas DataFrame移除未定义多余索引service_type_id问题
多余索引出现的原因
- 你的原始数据中本身包含
service_type_id数值型字段,groupby后执行sum()时,pandas默认会对所有非分组键的数值字段执行求和操作,因此service_type_id也被纳入了聚合计算范围 - 后续
unstack操作会生成多层列索引:第一层为被聚合的字段名(包含你需要的业务字段和多余的service_type_id),第二层为service_type的各类枚举值,就出现了你看到的多余索引内容
正确代码写法
场景1:仅需要对单个指定字段聚合
如果你只需要统计某一个字段(比如交易金额amount、交易数量count等)的分组求和结果,直接在sum()前指定要聚合的列即可:
# 示例为聚合amount字段,可替换为你实际需要统计的字段名 data_tr = data.groupby(['transaction_id', 'service_type'])['amount']\ .sum()\ .unstack()\ .reset_index()\ .fillna(0)\ .set_index('transaction_id')
场景2:需要对多个字段聚合,仅排除service_type_id
如果需要保留其他字段的聚合结果,先剔除不需要的service_type_id字段再执行后续操作即可:
data_tr = data.drop(columns=['service_type_id'])\ .groupby(['transaction_id', 'service_type'])\ .sum()\ .unstack()\ .reset_index()\ .fillna(0)\ .set_index('transaction_id')
如果不需要多层列索引,想把列名拍平,可以在unstack()之后新增列名处理逻辑:
# 拼接两层列名,格式为「聚合字段_服务类型」 data_tr.columns = [f"{col[0]}_{col[1]}" if col[0] != 'transaction_id' else col[0] for col in data_tr.columns]
内容的提问来源于stack exchange,提问作者Azul
相关产品推荐
相关产品推荐

