Python pandas使用groupby合并行时如何保留全部原始列?
问题原因
你当前代码仅保留两列的核心原因是:groupby操作后你只选择了name_hash列做拼接处理,其余列没有指定聚合规则,因此被自动丢弃。
解决方案
场景1:仅按qty_ordered分组,拼接同组的name_hash、保留其余所有列
如果同一个qty_ordered分组内,其余列的取值一致,可以用如下写法,其余列默认取分组内第一个值:
import pandas as pd data = pd.read_csv('in/tables/sales-order-item.csv') # 构造聚合规则:name_hash用空格拼接,其余列取分组内第一个值 agg_dict = {col: 'first' for col in data.columns if col != 'name_hash'} agg_dict['name_hash'] = ' '.join # 分组聚合,as_index=False避免分组键转为索引,无需额外reset_index data = data.groupby('qty_ordered', as_index=False).agg(agg_dict)
场景2:按qty_ordered+name_hash双字段合并行
如果你的实际需求是两个字段相同才合并为同一行,调整groupby的分组键即可:
import pandas as pd data = pd.read_csv('in/tables/sales-order-item.csv') # 双字段分组,其余列取分组内第一个值 data = data.groupby(['qty_ordered', 'name_hash'], as_index=False).agg('first')
补充说明
如果其余列有定制化的聚合需求(比如销售额列求和、时间列取最大值、其余字符串列拼接等),直接修改agg入参的字典即可,示例:
# 示例:order_amount列求和、create_time列取最大值、其余列取第一个 agg_dict = { 'name_hash': ' '.join, 'order_amount': 'sum', 'create_time': 'max', **{col: 'first' for col in data.columns if col not in ['name_hash', 'order_amount', 'create_time']} } data = data.groupby('qty_ordered', as_index=False).agg(agg_dict)
内容的提问来源于stack exchange,提问作者Daniel Chovanec
相关产品推荐
相关产品推荐

