如何合并pandas DataFrame中指定列取值相同的多行数据
实现方案
核心思路
- 先指定需要作为分组依据的字段(比如需求中的
KEY,以及你额外需要保留的单列字段),同分组内的这些字段取值唯一,分组后直接保留即可 - 对剩余字段编写通用聚合逻辑:自动判断列数据类型,字符串直接拼接,列表直接合并元素
完整实现代码
import pandas as pd # 构造示例数据 d = {"KEY": ["KEY2", "KEY2"], "String value": ["value 1", "value 2"], "list value": [["val1"], ["val2"]]} df = pd.DataFrame(d) # 1. 定义通用聚合函数 def merge_cols(series): # 过滤空值避免影响拼接 valid_values = [x for x in series if pd.notna(x)] if not valid_values: return None # 按类型处理拼接逻辑 if isinstance(valid_values[0], str): # 字符串直接拼接,需要分隔符可以修改引号内的内容,比如' '代表空格分隔 return ''.join(valid_values) elif isinstance(valid_values[0], list): # 合并所有列表元素 res = [] for lst in valid_values: res.extend(lst) return res # 其他类型可按需补充逻辑,比如数值求和可加return sum(valid_values) else: return valid_values[0] # 2. 指定分组键:KEY + 其他你要保留的单列字段,比如有同KEY下值相同的date列,就写['KEY', 'date'] group_keys = ['KEY'] # 3. 分组聚合:分组键直接保留,其余列应用合并逻辑 res = df.groupby(group_keys, as_index=False).agg(merge_cols) print(res)
运行效果验证
输出结果和需求预期一致:
KEY String value list value 0 KEY2 value 1value 2 [val1, val2]
注意事项
- 若你需要保留的额外单列字段在同一分组内存在不同取值,可根据需求修改逻辑,比如取第一个/最后一个值,对应修改聚合函数即可
- 字符串拼接如果需要添加分隔符(比如空格、顿号),修改聚合函数中
''.join的引号内容即可,比如'、'.join(valid_values)即可用顿号分隔多个字符串值
内容的提问来源于stack exchange,提问作者Mr.Hedge
相关产品推荐
相关产品推荐

