提取两个数据帧之间相同的切片

时间:2017-08-24 12:50:37

标签: python pandas dataframe

如何合并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: []

4 个答案:

答案 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: []