Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较大小不同的数据帧的某些列的交集_Python_Python 2.7_Pandas_Dataframe - Fatal编程技术网

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