如何合并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 :(得分:2)
只需merge
:
In[111]:
df1.merge(df2)
Out[111]:
A B C D
0 A0 B0 C0 D0
merge
的默认参数是合并所有列,执行inner
合并,只有在所有值同意的情况下
查看索引匹配要求,我会在合并之前过滤df:
In[131]:
filtered = df1.loc[df2.index].dropna()
filtered
Out[131]:
A B C D
1 A1 B1 C1 D1
然后合并
In[132]:
filtered.merge(df2)
Out[132]:
A B C D
0 A0 B0 C0 D0
如果索引完全不匹配,请说df2
的第一行是1
而不是2
:
In[133]:
filtered = df1.loc[df2.index].dropna()
filtered
Out[133]:
A B C D
1 A1 B1 C1 D1
然后merge
将返回一个空的df,因为索引行值不一致:
In[134]:
filtered.merge(df2)
Out[132]:
Empty DataFrame
Columns: [A, B, C, D]
Index: []
<强>更新强>
在新数据集上,merge
将重置索引,这是默认行为:
In[152]:
filtered.merge(df2)
Out[152]:
A B C D
0 A0 B0 C0 D0
1 A2 B2 C2 D2
2 A7 B7 C7 D7
因此,为了保留索引,我们可以使用相等运算符创建一个布尔掩码并调用dropna
,以便任何具有任何NaN
值的行将在值不一致的情况下发生放弃,这应该处理所有情况:
In[153]:
filtered[filtered== df2.loc[filtered.index]].dropna()
Out[153]:
A B C D
0 A0 B0 C0 D0
2 A2 B2 C2 D2
7 A7 B7 C7 D7
答案 1 :(得分:1)
如果您确定值相同,则可以执行以下操作:
df1.loc[df1.index.to_series().isin(df2.index)]
Theres无需合并。