如何合并字典值中以共同键关联的pandas DataFrame
动态合并字典中的多个Pandas DataFrame
问题背景
我有一个字典data,所有值都是Pandas DataFrame,结构如下:
{'x': player x1 0 foo x_val 1 bar x_val, 'y': player y1 0 foo y_val 1 bar y_val, 'z': player z1 0 foo z_val 1 bar z_val }
需要以player为键合并所有DataFrame,得到包含所有列的合并结果。但字典中的DataFrame数量不固定,无法用硬编码逐个merge的方式实现,尝试过循环和异常处理都没成功。
解决方案
方法1:用functools.reduce迭代合并
这是通用方案,不管列名是否重复都适用:
from functools import reduce import pandas as pd # 提取字典里所有的DataFrame df_list = list(data.values()) # 迭代合并所有DataFrame,指定合并键和方式 merged_df = reduce(lambda left_df, right_df: left_df.merge(right_df, on='player', how='outer'), df_list)
reduce会自动遍历df_list,把每个DataFrame和前一次的合并结果再合并how='outer'保留所有player的数据,若只需要保留所有DataFrame共有的player,换成how='inner'即可
方法2:索引拼接(适合无重复列名场景)
如果每个DataFrame除了player之外的列名都是唯一的(比如示例中的x1、y1、z1),可以用更高效的拼接方式:
import pandas as pd # 把每个DataFrame的索引设为player,然后横向拼接 df_list = [df.set_index('player') for df in data.values()] merged_df = pd.concat(df_list, axis=1).reset_index()
这种方式避免了多次merge的开销,速度更快,但如果存在重复列名,Pandas会自动给列名加后缀(如x1_x、x1_y),需要提前处理列名冲突。
内容的提问来源于stack exchange,提问作者bismo
相关产品推荐
相关产品推荐

