如何在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.
有人可以帮忙吗? :)
答案 0 :(得分:3)
df.merge(df2, on=list('ABCD'))
为您提供了一个DataFrame,其中两个DataFrame在列的值上具有相同的值。对于actual
列,它会生成两列:actual_x
和actual_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
列上具有不同的值。