【问题标题】:Comparing 2 columns of two Python Pandas dataframes and getting the common rows比较两个 Python Pandas 数据帧的 2 列并获取公共行
【发布时间】:2015-05-17 19:12:26
【问题描述】:

我有 2 个数据框如下:

DF1=
    A    B   C    D
0   AA   BA  KK   0
1   AD   BD  LL   0
2   AF   BF  MM   0

DF2=
    K    L
0   AA   BA
1   AD   BF
2   AF   BF

最后我想得到的是:

DF1=
    A    B   C    D
0   AA   BA  KK   1
1   AD   BD  LL   0
2   AF   BF  MM   1

所以,我想比较两个数据框,我想查看第一个数据框(A 列和 B 列)的哪些行与第二个数据框(K 列和 L 列)共有,并在 D 列上分配 1第一个数据帧。

我可以使用 for 循环,但是对于大量条目会很慢。

任何线索或建议将不胜感激。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果你重命名df2 的列然后你可以逐行比较,这会更容易:

    In [35]:
    
    df2.columns = ['A', 'B']
    df2
    Out[35]:
        A   B
    0  AA  BA
    1  AD  BF
    2  AF  BF
    In [38]:
    
    df1['D'] = (df1[['A', 'B']] == df2).all(axis=1).astype(int)
    df1
    Out[38]:
        A   B   C  D
    0  AA  BA  KK  1
    1  AD  BD  LL  0
    2  AF  BF  MM  1
    

    【讨论】:

    • 如果你不能重命名它们,你可以动态创建一个新的DataFrame,其内容是df2上的一个视图,但其列名匹配df1的,然后它只是又是这段代码。
    • 您可以将rename 的结果分配给另一个df 并进行比较df3 = df2.rename(columns={'K':'A', 'L':'B'})
    • 或者直接在表达式中使用df2.rename(…),而不是将其存储在临时名称df3中。
    • 当然,只是指出你的答案基本上仍然是正确的答案,即使他没有让自己变得容易(而且仍然没有那么难使用) ,所以希望他能接受这个答案,即使他出于某种原因无法更改df2 的定义。
    • @Alexander 这是 abarnert 在上面第二条评论中所说的,这取决于这一切的背景是什么
    【解决方案2】:
    df1['ColumnName'].isin(df2['ColumnName']).value_counts()
    

    【讨论】:

      【解决方案3】:

      我就是这样解决的:

      df1 = pd.DataFrame({"A":['AA','AD','AD'], "B":['BA','BD','BF']})
      df2 = pd.DataFrame({"A":['AA','AD'], 'B':['BA','BF']})
      df1['compressed']=df1.apply(lambda x:'%s%s' % (x['A'],x['B']),axis=1)
      df2['compressed']=df2.apply(lambda x:'%s%s' % (x['A'],x['B']),axis=1)
      df1['Success'] = df1['compressed'].isin(df2['compressed']).astype(int)
      print df1
      
          A   B     compressed   Success
      0  AA  BA      AABA          1
      1  AD  BD      ADBD          0
      2  AD  BF      ADBF          1
      

      【讨论】:

      • 你的回答与原问题有什么关系?
      • 我尝试过使用不同的数据框,它可以达到目的。
      • 但你想要的输出不是原来的问题,你应该更新你的问题或发布一个新问题
      • 这是一个令人困惑的回答,并没有解释发生了什么或为什么。此页面上至少还有一个更好的答案。
      【解决方案4】:
      DF1.merge(right=DF2, left_on=[DF1.A, DF1.B], right_on=[DF2.K, DF2.L], indicator=True, how='left')
      

      给予:

      A   B   C  D    K    L     _merge
      0  AA  BA  KK  0   AA   BA       both
      1  AD  BD  LL  0  NaN  NaN  left_only
      2  AF  BF  MM  0   AF   BF       both
      

      因此,如上所述,指标完成了这项工作。

      【讨论】:

        猜你喜欢
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多