【问题标题】:compare intersection of certain columns of dataframes sized different比较大小不同的数据框的某些列的交集
【发布时间】:2017-02-20 17:19:53
【问题描述】:

我在以我想要的方式比较两个数据帧时遇到了一些麻烦:

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 以及 df1 的其他列中保留具有相同“code1”和“code2”的行。 你知道最好的方法吗?我想避免循环,我需要它是有效的。 提前非常感谢您

【问题讨论】:

    标签: python python-2.7 pandas dataframe


    【解决方案1】:

    您可以简单地使用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
    

    【讨论】:

    • 好的,谢谢!如果我想将已删除的案例保留在另一个数据框中怎么办???
    • @emilio.molina,请参阅更新
    • 完美,非常感谢!!所以'indicator'是决定你保存数据帧哪一部分的参数,不是吗?
    • 另一个相关问题:如果 df2 列的名称不同怎么办?例如 CODE1、CODE2。这是我关于这个的最后一个问题!再次感谢您!
    • @emilio.molina,使用left_onright_on 参数而不是on
    【解决方案2】:

    我会将索引设置为您想要的列并执行连接:

    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
    

    【讨论】:

    • 没关系。非常感谢。但是我有两个问题。首先是我在这个意义上提出了这个问题,但实际上我想保留其他值,即第 2 列中带有 NaN 的值。我的第二个问题是 df2 有很多列(63)。所以这样做会让我删除所有添加的列,这很糟糕......
    • 顺便说一句,很抱歉,在我获得 15 的声望之前我不能加分,所以我不能接受你的回答......我相信其他人会这样做,不要担心
    • 好的,我做到了。然而,虽然你的回答很有用,但它并不能完全解决我的问题,我想得到其他答案......我不知道如果它被标记为已解决,其他人是否会关心这个问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多