You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并多个Pandas DataFrame,整合同名行的分散列数据并去重?

问题描述

现有一个包含多个Pandas DataFrame的列表,需要将它们合并为一个DataFrame,把同一name对应的分散列数据(如height、weight)整合到同一行。

示例输入列表:

import pandas as pd
list_of_frames = [
    pd.DataFrame({'name':'adam', 'height':'180'}, index=[0]),
    pd.DataFrame({'name':'adam', 'weight':'80'}, index=[1]),
    pd.DataFrame({'name':'eve', 'height':'190'}, index=[2])
]

期望得到的目标DataFrame:

name    height  weight
0   adam    180     80
1   eve     190     NaN

尝试用pd.concat()得到了多行分散的结果,用reduce结合pd.merge()又出现带后缀的重复列,求正确实现方法。

解决方案

方法一:拼接后分组聚合(最稳妥)

先把所有小DataFrame拼接成一个大表,再按name分组,取每个分组里每列的第一个非空值就行——因为同一name下的同一列只会有一个有效值,剩下的都是空值。

import pandas as pd

# 拼接所有DataFrame,忽略原索引
combined = pd.concat(list_of_frames, ignore_index=True)
# 按name分组,聚合取非空值
result = combined.groupby('name', as_index=False).first()

运行后就能得到目标结果,用max()或者last()替代first()也可以,效果一致。

方法二:修正reduce+merge的用法

之前出现重复列是因为没明确合并规则,只要指定按name做外连接,并且不让merge自动加后缀,就能避免问题:

import pandas as pd
from functools import reduce

# 自定义合并函数,按name外连接,不添加后缀
def merge_dfs(df1, df2):
    return pd.merge(df1, df2, on='name', how='outer', suffixes=('', ''))

# 用reduce批量合并所有DataFrame
result = reduce(merge_dfs, list_of_frames)
# 最后再按name去重取非空值(防止极端情况出现重复列)
result = result.groupby('name', as_index=False).first()

内容的提问来源于stack exchange,提问作者Firefighting Physicist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:52:08