Python 通过df字典循环以合并df';熊猫身上的昆虫

Python 通过df字典循环以合并df';熊猫身上的昆虫,python,for-loop,dictionary,pandas,dataframe,Python,For Loop,Dictionary,Pandas,Dataframe,我有以下带有数据帧的字典 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

我有以下带有数据帧的字典

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')
但这给了我一个毫无意义的结果

我感谢你的帮助

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
   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
请注意,
df_all.values()
以未指定的顺序返回
dict
中的值。如果你想要一个特定的顺序,你必须做一些类似于按键排序的事情


或者,您可以使用
pd.concat
创建具有分层列的数据帧:

df = pd.concat(df_all, axis=1).dropna(axis=0)
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
   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
很脆弱——我假设数据帧没有NaN值,但可能有不同的索引。然后使用
dropna
生成内部联接。)

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

尝试
pd.merge(A,A,…)
,您将看到为什么您的结果不起作用。@chrisaycock我知道为什么它们不起作用。问题是我不知道如何让它们工作。有线索吗?df有不同的索引。concat选项是一个不错的选择。Thanksure
df_all.values()
是一个列表(或iterable),因此如果您愿意,可以在此处提供不同的列表。最后一个问题。是否有可能将层次结构的df转换为正常的df…比如用df1..df2去掉额外的级别?愚蠢的问题。出于信息目的,答案是df.columns=df.columns.get_level_values(1)。另一种选择是使用
df=pd.concat(df_all.values(),axis=1)。dropna(axis=0)
。(因此,首先不会创建分层列。)