pandas 合并了多个不同大小和列的数据框

pandas merged multiple dataframes of different size and columns

我有很多从 0 到 N 的数据帧需要合并。它们都有一个共同的列,称为 'NAME'。我在合并和连接上尝试了不同的方法,但数据帧没有return我需要的格式

这些是我的一些数据样本

d1 = {'col1': [1,1], 'col2': [1,1], 'NAME': ["A","A"]}
d2 = {'col3': [1,1], 'col4': [1,1], 'NAME': ["A","A"]}
d3 = {'col1': [2,2], 'col2': [2,2], 'NAME': ["B","B"]}
d4 = {'col3': [2,2], 'col4': [2,2], 'NAME': ["B","B"]}
d5 = {'col5': []}
d6 = {'col5': []}

df_list = [d1, d2, d3, d4, d5, d6]

test_df = []
for item in df_list:
    temp_df = pd.DataFrame(data=item)
    test_df.append(temp_df)

merged = reduce(lambda left, right: pd.merge(left, right, on="NAME", how='outer'),test_df)

上面的代码也报错:KeyError: 'NAME'

我希望我的合并结果是

   col1 col2 col3 col4 NAME
0     1    1    1    1    A
1     1    1    1    1    A
0     2    2    2    2    B
1     2    2    2    2    B
d1 = {'col1': [1,1], 'col2': [1,1], 'NAME': ["A","A"]}
d2 = {'col3': [1,1], 'col4': [1,1], 'NAME': ["A","A"]}
d3 = {'col1': [2,2], 'col2': [2,2], 'NAME': ["B","B"]}
d4 = {'col3': [2,2], 'col4': [2,2], 'NAME': ["B","B"]}
d5 = {'col5': []}
d6 = {'col5': []}

df_list = [d1, d2, d3, d4]

test_df = []
for item in df_list:
    temp_df = pd.DataFrame(data=item)
    test_df.append(temp_df)

merged = reduce(lambda left, right: pd.merge(left, right, on="NAME", how='outer'),test_df)
merged["col5"] = None
col1_x col2_x NAME col3_x col4_x col1_y col2_y col3_y col4_y col5
0 1 1 A 1 1 nan nan nan nan
1 1 1 A 1 1 nan nan nan nan
2 1 1 A 1 1 nan nan nan nan
3 1 1 A 1 1 nan nan nan nan
4 nan nan B nan nan 2 2 2 2
5 nan nan B nan nan 2 2 2 2
6 nan nan B nan nan 2 2 2 2
7 nan nan B nan nan 2 2 2 2

pandas.DataFrame.merge

如果只想扩展一列,那么可以单独添加一列,不合并

KeyError: 'NAME'

假设每个数据帧的 NAME 值都是唯一的,我会在这里使用 pandas.concat

(pd
 .concat(test_df).rename_axis('index')
 .groupby(['NAME', 'index']).first()
 .reset_index('NAME')
)

输出:

      NAME  col1  col2  col3  col4
index                             
0        A   1.0   1.0   1.0   1.0
1        A   1.0   1.0   1.0   1.0
0        B   2.0   2.0   2.0   2.0
1        B   2.0   2.0   2.0   2.0