我有一些麻烦要按照我喜欢的方式比较两个数据帧:
$bluevalue = dechex($blue)."<br>";
这是我想要比较的两个数据帧。我需要做一些像
这样的事情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']])
我想在df1和df2以及df1的其他列中保留具有相同“code1”和“code2”的行。 你知道最好的方法吗?我想避免循环,我需要它是有效的。 非常感谢您提前
答案 0 :(得分:0)
我会将索引设置为您想要的列并执行连接:
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_index()
:
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
答案 1 :(得分:0)
您只需使用merge()方法:
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