我有以下带有数据帧的字典
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}
我想通过索引将它们合并为'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')
结果看起来像
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')
但这给了我一个无意义的结果。
我很感激帮助。
答案 0 :(得分: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()
会以未指定的顺序返回dict
中的值。如果你想要一个特定的订单,你必须做一些像按键排序......
或者,您可以使用pd.concat
:
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
在这里很脆弱 - 我假设DataFrames没有NaN值,但可能有不同的索引。dropna
然后用于生成内部加入。)
答案 1 :(得分: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