Python 比较大小不同的数据帧的某些列的交集
我很难按照我喜欢的方式比较两个数据帧:Python 比较大小不同的数据帧的某些列的交集,python,python-2.7,pandas,dataframe,Python,Python 2.7,Pandas,Dataframe,我很难按照我喜欢的方式比较两个数据帧: df1=pd.DataFrame({"code1": ['A', 'B', 'C', 'C','D'], "code2": ["1", "0", "1", "1","1"], "column1":['value1','value2','value3','value4','value5']}) code1 code2 column1 0 A 1 value1 1
df1=pd.DataFrame({"code1": ['A', 'B', 'C', 'C','D'],
"code2": ["1", "0", "1", "1","1"],
"column1":['value1','value2','value3','value4','value5']})
code1 code2 column1
0 A 1 value1
1 B 0 value2
2 C 1 value3
3 C 1 value4
4 D 1 value5
df2 = pd.DataFrame({"code1": ['A','B','C'],
"code2": ["0", "0", "1"],
"column2":['valuex','valuey','valuez']})
code1 code2 column2
0 A 0 valuex
1 B 0 valuey
2 C 1 valuez
这是我想比较的两个数据帧。我需要做一些类似的事情
df1[['code1','code2']].isin(df2[['code1','code2']])
为了得到结果:
code1 code2 column1
0 B 0 value2
1 C 1 value3
2 C 1 value4
我想保留df1和df2中具有相同“code1”和“code2”的行,以及df1的其他列。
你知道最好的方法吗??我想避免循环,我需要它是有效的。
非常感谢您提前我会将索引设置为您想要的列并执行联接:
df1=df1.set_index(['code1','code2'])
df2=df2.set_index(['code1','code2'])
In [90]: df1.join(df2)
Out[90]:
column1 column2
code1 code2
A 1 value1 NaN
B 0 value2 valuey
C 1 value3 valuez
1 value4 valuez
D 1 value5 NaN
要摆脱NaN:dropna
df1.join(df2)
Out[94]:
column1 column2
code1 code2
B 0 value2 valuey
C 1 value3 valuez
1 value4 valuez
然后,如果您不想使用reset\u index()
,可以放弃索引:
您可以简单地使用以下方法:
更新:
如果我想在另一个数据帧中保留已删除的案例,该怎么办
那很好。非常感谢你。然而,我有两个问题。首先,我提出了这个问题,但实际上我想保留其他值,即第2列中带有NaN的值。我的第二个问题是df2有很多列(63)。所以这样做会让我删除所有添加的列,这是一件非常糟糕的事情……顺便说一句,我很抱歉,在我获得15%的声誉之前,我不能添加分数,所以我不能接受你的答案。。。我相信其他人会做的,别担心好吧,我做了。然而,尽管你的答案很有用,但它并不能完全解决我的问题,我想得到其他答案。。。我不知道如果这个问题被标记为已解决,其他人是否会关心它…好的,谢谢!如果我想在另一个数据框中保留已删除的案例呢???@emilio.molina,请参阅UPDATEperfect,非常感谢!!所以“indicator”是决定保存数据帧哪一部分的参数,不是吗?另一个相关问题是:如果df2列的名称不同怎么办?例如代码1、代码2。这是我最后一个问题!再次感谢你@emilio.molina,使用
left_on
和right_on
参数,而不是on
df1.join(df2).dropna().reset_index()
Out[95]:
code1 code2 column1 column2
0 B 0 value2 valuey
1 C 1 value3 valuez
2 C 1 value4 valuez
In [30]: cols = ['code1','code2']
In [31]: pd.merge(df1, df2[cols], on=cols)
Out[31]:
code1 code2 column1
0 B 0 value2
1 C 1 value3
2 C 1 value4
In [62]: pd.merge(df1, df2[cols], on=cols, how='left', indicator=True).query("_merge == 'left_only'")
Out[62]:
code1 code2 column1 _merge
0 A 1 value1 left_only
4 D 1 value5 left_only