如何基于a类与命名不同的b类列合并多个Pandas DataFrame
解决方法
方法一:优化reduce合并逻辑
你完全可以用reduce实现需求,只需要在合并时明确以a列为键,由于除a外其他列名都是唯一的,不需要额外设置后缀。修改后的代码如下:
import pandas as pd from functools import reduce # 创建示例DataFrame df1 = pd.DataFrame({'a': [1, 2, 3], 'b1': [4, 5, 6], 'c1': [7, 8, 9]}) df2 = pd.DataFrame({'a': [1, 2, 3], 'b2': [4, 5, 6], 'c2': [13, 14, 15]}) df3 = pd.DataFrame({'a': [1, 2, 3], 'b3': [4, 5, 9], 'c3': [19, 20, 21]}) df4 = pd.DataFrame({'a': [1, 2, 3], 'b4': [1, 5, 6], 'c4': [25, 26, 27]}) dfs = [df1, df2, df3, df4] # 基于a列依次合并所有DataFrame merged_df = reduce(lambda left, right: pd.merge(left, right, on='a'), dfs) # 查看结果 print(merged_df)
运行后会得到你想要的结构:仅保留一次a列,所有b*、c*列全部保留。
方法二:concat结合索引合并(更高效)
如果处理40个DataFrame,这种方法性能更优:
- 先将每个DataFrame的
a列设为索引 - 横向拼接所有DataFrame
- 最后重置索引恢复
a列为普通列
代码示例:
import pandas as pd # 创建示例DataFrame df1 = pd.DataFrame({'a': [1, 2, 3], 'b1': [4, 5, 6], 'c1': [7, 8, 9]}) df2 = pd.DataFrame({'a': [1, 2, 3], 'b2': [4, 5, 6], 'c2': [13, 14, 15]}) df3 = pd.DataFrame({'a': [1, 2, 3], 'b3': [4, 5, 9], 'c3': [19, 20, 21]}) df4 = pd.DataFrame({'a': [1, 2, 3], 'b4': [1, 5, 6], 'c4': [25, 26, 27]}) dfs = [df1, df2, df3, df4] # 每个df设置a为索引后拼接 merged_df = pd.concat([df.set_index('a') for df in dfs], axis=1).reset_index() # 查看结果 print(merged_df)
结果验证
两种方法得到的结果均符合预期,比如提取a=2的行:
a b1 c1 b2 c2 b3 c3 b4 c4 1 2 5 8 5 14 5 20 5 26
内容的提问来源于stack exchange,提问作者srinivas
相关产品推荐
相关产品推荐

