[英]Merging dataframes based on index
如何合并2个数据帧df1
和df2
,以获得具有相同索引(且列中具有相同值)的df1
和df2
行的df3
?
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: []
只是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: []
UPDATE
在您的新数据集上, 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
以便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
如果确定值相同,则可以执行以下操作:
df1.loc[df1.index.to_series().isin(df2.index)]
无需进行合并。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.