如何合并2个数据框df1
和df2
,以便获得具有相同索引的df3
和df1
行的df2
(列中的值相同)?
df1 = pd.DataFrame({'A': ['A0', 'A2', 'A3', 'A7'],
'B': ['B0', 'B2', 'B3', 'B7'],
'C': ['C0', 'C2', 'C3', 'C7'],
'D': ['D0', 'D2', 'D3', 'D7']},
index=[0, 2, 3,7])
df2 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A7'],
'B': ['B0', 'B1', 'B2', 'B7'],
'C': ['C0', 'C1', 'C2', 'C7'],
'D': ['D0', 'D1', 'D2', 'D7']},
index=[0, 1, 2, 7])
df2 = pd.DataFrame({'A': ['A1'],
'B': ['B1'],
'C': ['C1'],
'D': ['D1']},
index=[1])
Out[13]:
A B C D
0 A0 B0 C0 D0
2 A2 B2 C2 D2
7 A7 B7 C7 D7
Empty DataFrame
Columns: [A, B, C, D]
Index: []
答案 0 :(得分:1)
首先,得到指数。接下来,找到所有列相同的所有行,然后只索引到任一数据帧。
idx = df1.index & df2.index
df_out = df1.loc[(df1.loc[idx] == df2.loc[idx]).all(1).index]
print(df_out)
你也可以使用df.isin
(与其他答案略有不同):
df_out = df1[df1.isin(df2).all(1)]
print(df_out)
测试1
A B C D
0 A0 B0 C0 D0
2 A2 B2 C2 D2
7 A7 B7 C7 D7
测试2
Empty DataFrame
Columns: [A, B, C, D]
Index: []
答案 1 :(得分:0)
我相信这是更好的pythonic解决方案:
df1[df2.isin(df1)].dropna()
给出:
A B C D
0 A0 B0 C0 D0
2 A2 B2 C2 D2
7 A7 B7 C7 D7
答案 2 :(得分:0)
pd.merge(df1.reset_index(), df2.reset_index()).set_index('index')
这会将每个数据框的索引添加为一列,然后连接所有列(现在包含索引),然后将索引设置为原始值。
答案 3 :(得分:0)
或者你可以试试这个。
对于测试1
df1['index']=df1.index
df2['index']=df2.index
df1['Mark']=df1.apply(lambda x : ' '.join(x.astype(str)),axis=1)
df2['Mark']=df2.apply(lambda x : ' '.join(x.astype(str)),axis=1)
df1[df1.Mark.isin(df2.Mark)].drop(['Mark','index'],1)
Out[20]:
A B C D
0 A0 B0 C0 D0
2 A2 B2 C2 D2
7 A7 B7 C7 D7
对于测试2
Out[28]:
Empty DataFrame
Columns: [A, B, C, D]
Index: []