繁体   English   中英

根据索引合并数据框

[英]Merging dataframes based on index

如何合并2个数据帧df1df2 ,以获得具有相同索引(且列中具有相同值)的df1df2行的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])

测试1

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])

测试2

df2 = pd.DataFrame({'A': ['A1'],
                    'B': ['B1'],
                    'C': ['C1'],
                    'D': ['D1']},
                     index=[1])

预期输出测试1

Out[13]: 
    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: []

只是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM