比较大小不同的某些数据帧列的交集

时间:2017-02-20 17:19:53

标签: python python-2.7 pandas dataframe

我有一些麻烦要按照我喜欢的方式比较两个数据帧:

$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”的行。 你知道最好的方法吗?我想避免循环,我需要它是有效的。 非常感谢您提前

2 个答案:

答案 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