使用reduce合并多个pandas DataFrame报错,如何正确修复?
修复reduce合并多个DataFrame时的后缀重复错误
当你用固定的suffixes=('_x', '_y')通过reduce合并多个DataFrame时,合并到第3个及之后的DataFrame会触发列名重复冲突:
- 第一次合并data1和data2:生成
value_x(来自data1)、value_y(来自data2) - 第二次合并上述结果和data3:此时right的
value列和left中现有列不重名,直接保留为value - 第三次合并上述结果和data4:此时left已有
value列,会给它加后缀_x,但left中已经存在之前生成的value_x,导致列名重复触发报错
方法一:提前给每个DataFrame的value列加唯一后缀
在创建DataFrame时,直接给每个value列按序号命名,这样合并时不会有同名列,无需指定suffixes:
import pandas as pd from functools import reduce data1 = [['A',1], ['B',2], ['C',3]] data2 = [['A',4], ['B',5], ['C',6]] data3 = [['A',7], ['B',8], ['C',9]] data4 = [['A',10], ['B',11], ['C',12]] dfs = [] # 给每个df的value列加上唯一序号后缀 for idx, data in enumerate([data1, data2, data3, data4], start=1): df = pd.DataFrame(data, columns=['name', f'value_{idx}']) dfs.append(df) # 合并时无需指定suffixes dfm = reduce(lambda left, right: pd.merge(left, right, on=['name'], how='outer'), dfs) print(dfm)
方法二:用concat替代reduce合并(更简洁)
由于所有DataFrame结构一致,可先将它们按name设为索引后横向拼接,再重命名列:
import pandas as pd data1 = [['A',1], ['B',2], ['C',3]] data2 = [['A',4], ['B',5], ['C',6]] data3 = [['A',7], ['B',8], ['C',9]] data4 = [['A',10], ['B',11], ['C',12]] # 生成所有df并设置name为索引 dfs = [pd.DataFrame(data, columns=['name', 'value']).set_index('name') for data in [data1, data2, data3, data4]] # 横向拼接 df_concat = pd.concat(dfs, axis=1) # 重命名列 df_concat.columns = [f'value_{i+1}' for i in range(len(dfs))] # 恢复name为普通列 dfm = df_concat.reset_index() print(dfm)
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

