通过df字典循环,以便在Pandas中合并df

her*_*lla 5 python dictionary for-loop dataframe pandas

我有以下字典与数据帧

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}
Run Code Online (Sandbox Code Playgroud)

我想通过它们的索引合并它们'inner',但是使用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')
Run Code Online (Sandbox Code Playgroud)

结果看起来像

   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
Run Code Online (Sandbox Code Playgroud)

我尝试过傻事

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

但这给了我一个无稽之谈的结果.

我很感激帮助.

unu*_*tbu 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)
Run Code Online (Sandbox Code Playgroud)

产量

   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
Run Code Online (Sandbox Code Playgroud)

请注意,以未指定的顺序df_all.values()返回值dict.如果你想要一个特定的订单,你必须做一些像按键排序的事情......


或者,您可以使用以下方法创建具有分层列的DataFrame pd.concat:

df = pd.concat(df_all, axis=1).dropna(axis=0)
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

   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
Run Code Online (Sandbox Code Playgroud)

(警告:pd.concat在这里使用是脆弱的 - 我假设DataFrames没有NaN值,但可能有不同的索引.dropna然后用于生成内连接.)