某些列上常见的行,其他列上的行不同

时间:2017-07-12 09:08:08

标签: python pandas

如何在2个数据帧的某些列上获取相同的行,但在给定列上有所不同?

例如

选择cols [A,B,C]的2 dfs中具有相同值的行,但列'actual'具有不同的值

import pandas as pd
df = pd.DataFrame({"A":list(range(10)),
                   "B":list(range(10,20)),
                   "C":list(range(20,30)),
                   "D":list(range(30,40)),
                   "actual":[1 for x in range(10)]})

df2 = pd.DataFrame({"A":list(range(15)),
                   "B":list(range(5,20)),
                   "C":list(range(15,30)),
                   "D":list(range(45,60)),
                   "actual":[0 for x in range(15)]})

    df.iloc[5] = [5,10,20,20,1]
Out[12]: 
   A   B   C   D  actual
0  0  10  20  30       1
1  1  11  21  31       1
2  2  12  22  32       1
3  3  13  23  33       1
4  4  14  24  34       1
5  5  10  20  20       1
6  6  16  26  36       1
7  7  17  27  37       1
8  8  18  28  38       1
9  9  19  29  39       1

df2
Out[13]: 
     A   B   C   D  actual
0    0   5  15  45       0
1    1   6  16  46       0
2    2   7  17  47       0
3    3   8  18  48       0
4    4   9  19  49       0
5    5  10  20  50       0
6    6  11  21  51       0
7    7  12  22  52       0
8    8  13  23  53       0
9    9  14  24  54       0
10  10  15  25  55       0
11  11  16  26  56       0
12  12  17  27  57       0
13  13  18  28  58       0
14  14  19  29  59       0

我希望df2中的所有索引在df1中都相同,但具有不同的“实际”值。例如

A  B   C   D
5  10  20  50 

是df2中的索引5.

有人可以帮忙吗? :)

1 个答案:

答案 0 :(得分:3)

df.merge(df2, on=list('ABCD'))

为您提供了一个DataFrame,其中两个DataFrame在列的值上具有相同的值。对于actual列,它会生成两列:actual_xactual_y

   A   B   C   D  actual_x  actual_y
0  5  10  20  50         1         0

如果您想传递另一个条件,可以通过以下方式完成:

df.merge(df2, on=list('ABCD'))[lambda v: v['actual_x'] != v['actual_y']]
# Or
df.merge(df2, on=list('ABCD')).query('actual_x != actual_y')

这将为您提供一个DataFrame,其中两个df在ABCD上具有相同的值,但在actual列上具有不同的值。