【问题标题】:How to count overlap rows among multiple dataframes?如何计算多个数据帧之间的重叠行?
【发布时间】:2020-05-08 05:50:39
【问题描述】:

我有一个如下所示的多个数据框。

df1 = pd.DataFrame({'Col1':["aaa","ddd","ggg"],'Col2':["bbb","eee","hhh"],'Col3':"ccc","fff","iii"]})
df2= pd.DataFrame({'Col1':["aaa","zzz","qqq"],'Col2':["bbb","xxx","eee"],'Col3':["ccc", yyy","www"]})
df3= pd.DataFrame({'Col1':"rrr","zzz","qqq","ppp"],'Col2':"ttt","xxx","eee","ttt"],'Col3':"yyy","yyy","www","qqq"]})

数据框有 3 列,有时它们的行在数据框之间重叠。 (例如 df1 和 df2 与 "aaa, bbb, ccc" 具有相同的行)。

我想知道数据帧之间的行是如何重叠的,并希望得到如下所示的输出。

在此输出中,如果在数据帧中检测到相同的行,则输出将为 1,否则为 0。有人知道如何进行此输出吗?

在实际数据中,我有大约 100 个数据帧。我首先尝试使用 pd.merge 但无法将其应用于 100 个数据帧...

非常感谢您的帮助。

【问题讨论】:

    标签: python pandas merge overlap


    【解决方案1】:

    设置:

    df1 = pd.DataFrame({'Col1':["aaa","ddd","ggg"],'Col2':["bbb","eee","hhh"],'Col3':["ccc","fff","iii"]})
    df2= pd.DataFrame({'Col1':["aaa","zzz","qqq"],'Col2':["bbb","xxx","eee"],'Col3':["ccc", "yyy","www"]})
    df3= pd.DataFrame({'Col1':["rrr","zzz","qqq","ppp"],'Col2':["ttt","xxx","eee","ttt"],'Col3':["yyy","yyy","www","qqq"]})
    

    解决方案:

    首先为每个数据框创建一个指示列,然后是 concat、groupby 和 sum。

    df1['df1'] = df2['df2'] = df3['df3'] = 1
    (
        pd.concat([df1, df2, df3], sort=False)
        .groupby(by=['Col1', 'Col2', 'Col3'])
        .max().astype(int)
        .reset_index()
    )
    
            Col1    Col2    Col3    df1 df2 df3
    0       aaa     bbb     ccc     1   1   0
    1       ddd     eee     fff     1   0   0
    2       ggg     hhh     iii     1   0   0
    3       ppp     ttt     qqq     0   0   1
    4       qqq     eee     www     0   1   1
    5       rrr     ttt     yyy     0   0   1
    6       zzz     xxx     yyy     0   1   1
    

    【讨论】:

    • Sum 和 max 在这种情况下是相同的,因为 sum 永远不会超过 1。
    • Sum 和 max 在这种情况下应该都可以工作,但感谢 jezrael 的建议,将其更新为 max 以提高可读性。
    【解决方案2】:

    这是使用concatget_dummies 的一种方法:

    l = [df1,df2,df3] #create a list of dataframes
    final = pd.concat([i.assign(key=f"df{e+1}") for e,i in enumerate(l)],sort=False)
    
    final = (final.assign(**pd.get_dummies(final.pop('key')))
            .groupby(['Col1','Col2','Col3']).max().reset_index())
    

      Col1 Col2 Col3  df1  df2  df3
    0  aaa  bbb  ccc    1    1    0
    1  ddd  eee  fff    1    0    0
    2  ggg  hhh  iii    1    0    0
    3  ppp  ttt  qqq    0    0    1
    4  qqq  eee  www    0    1    1
    5  rrr  ttt  yyy    0    0    1
    6  zzz  xxx  yyy    0    1    1
    

    【讨论】:

      【解决方案3】:

      使用pandas.concatgroupby

      dfs = [df1,df2,df3]
      dfs = [d.assign(df='df%s' % n) for n, d in enumerate(dfs, start=1)]
      new_df = pd.concat(dfs).groupby(['Col1', 'Col2', 'Col3','df']).size().unstack(fill_value=0)
      print(new_df)
      

      输出:

      df              df1  df2  df3
      Col1 Col2 Col3               
      aaa  bbb  ccc     1    1    0
      ddd  eee  fff     1    0    0
      ggg  hhh  iii     1    0    0
      ppp  ttt  qqq     0    0    1
      qqq  eee  www     0    1    1
      rrr  ttt  yyy     0    0    1
      zzz  xxx  yyy     0    1    1
      

      【讨论】:

      • 我认为 OP 需要假人,而不是计数
      猜你喜欢
      • 2021-03-01
      • 1970-01-01
      • 2014-09-29
      • 2011-09-25
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 2013-08-06
      • 2021-08-11
      相关资源
      最近更新 更多