根据索引合并数据帧

时间:2017-08-24 08:46:38

标签: python pandas dataframe merge

如何合并2个数据框df1df2,以获得具有相同索引的df3df1行的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])

测试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: []

2 个答案:

答案 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无需合并。