按顺序遍历df字典以合并Pandas中的df

5 投票
2 回答
3519 浏览
提问于 2025-04-19 17:36

我有一个包含数据框的字典。

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3])
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3])
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3])

df_all = {'df1': A, 'df2': B, 'df3': C}

我想通过它们的索引进行“内连接”合并,但想用一个for循环来实现。这相当于做

df4 = pd.merge(A, B, left_index=True, right_index=True, how='inner')
df5 = pd.merge(df4, C, left_index=True, right_index=True, how='inner')

结果应该是这样的:

   A_x  B_x  A_y  B_y  A  B
1    2    1    1    1  1  2
2    2    1    2    2  1  2
3    2    1    3    3  1  2

我试过一些简单的方法,比如:

for key, value in df_all.iteritems():
    df = pd.merge(value, value, left_index=True, right_index=True, how='inner')

但这样得到的结果完全不对。

感谢大家的帮助。

2 个回答

2

concat可以满足你的需求:

In [11]: pd.concat([A, B, C], axis=1, keys=['df1', 'df2', 'df3'])
Out[11]:
   df1     df2     df3
     A  B    A  B    A  B
1    2  1    1  1    1  2
2    2  1    2  2    1  2
3    2  1    3  3    1  2
7
import pandas as pd
import functools

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3])
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3])
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3])

df_all = {'df1': A, 'df2': B, 'df3': C}
merge = functools.partial(pd.merge, left_index=True, right_index=True, how='inner')
df = functools.reduce(merge, df_all.values())
print(df)

产生

   A_x  B_x  A_y  B_y  A  B
1    2    1    1    2  1  1
2    2    1    1    2  2  2
3    2    1    1    2  3  3

注意,df_all.values() 返回的是字典中的值,但顺序是不确定的。如果你想要特定的顺序,就得按键排序之类的...


或者,你可以使用 pd.concat 创建一个具有层次列的 DataFrame:

df = pd.concat(df_all, axis=1).dropna(axis=0)
print(df)

产生

   df1     df2     df3   
     A  B    A  B    A  B
1    2  1    1  1    1  2
2    2  1    2  2    1  2
3    2  1    3  3    1  2

(注意:在这里使用 pd.concat 有点脆弱——我假设这些 DataFrame 中没有 NaN 值,但可能有不同的索引。然后使用 dropna 来进行内连接。)

撰写回答