【问题标题】:Python Pandas: What is the most efficient way to compare two lists in a loop?Python Pandas:在循环中比较两个列表的最有效方法是什么?
【发布时间】:2015-04-21 18:52:57
【问题描述】:

我有一个地面实况数据集“gt”(包含 100 个条目),如下所示:

    org_o                  shh group
    ArabsGate               1   1
    ArabsGate Company       1   1
    AS EMT                 NaN  2
    AS EMT Mobile Internet  1   2
    DigitalEffex (MH)      NaN  3
    DigitalEffex            1   3
    Aruba S.p.A.            1   4
    Aruba S.p.              1   4

我想将其与一个巨大的数据框“df”进行比较,如下所示:

        match           org_o 
        as emt        AS EMT                   
        as emt        AS EMT Mobile Internet    
        digitaleffex  DigitalEffex (MH)    
        digitaleffex  DigitalEffex
        digitaleffex  Digital

作为比较的结果,我希望我的 df 中是否存在具有相同 org_o 的同一组。因此,对于每个组,该组的计数或成员,以及实际的 org_o 名称。例如,我们同时拥有“Aruba S.p.A.”和“Aruba S.p.”在 df 中,它们是否匹配到一组中的相同关键字(“匹配”列)。

这是我所做的,但并不是我真正想要的。

gt.groupby('group').count()['org_o']
df.merge(gt, on  = 'org_o')

最终我想计算误报/误报。这是预期的输出:

        match           org_o                 tag
        as emt        AS EMT                   TP
        as emt        AS EMT Mobile Internet   TP   
        digitaleffex  DigitalEffex (MH)        TP
        digitaleffex  DigitalEffex             TP
        digitaleffex  Digital                  FP

有人可以帮忙吗?

【问题讨论】:

  • 你能发布预期的输出吗?换句话说,你想用 dfmatch 替换 gtorg_o 名称,然后计算或 .. ?
  • @JohnGalt 我已经更新了我的问题。
  • 您是否只比较第一列中的值?对每个列表进行循环有什么问题?运行时间为 O(n*m),其中 n 和 m 是每个列表的大小。
  • @tommy.carstensen 是的,而且它们在 gt 数据中属于同一组

标签: python list dictionary pandas comparison


【解决方案1】:

看起来你需要的是简单的查找 -

df['tag'] = np.where(df['org_o'].isin(gt['org_o']), 'TP', 'FP')

在这里,我们向df 添加了一个新列tag。我们正在使用 numpy 的where 函数来检查df 中的org_o 是否存在于gt 中。如果是,则将TP 作为tag 的值分配给该行,否则分配FP

就效率而言,这种“查找”是相当高效的,因为在使用isin时,pandas会将值转换为比较(在这种情况下为gt['org_o']into a set,因此查找时间为O(n * log m)

【讨论】:

    【解决方案2】:

    这是一种方法。

    最初用“FP”分配tag

    In [4]: df['tag'] = 'FP'
    

    使用df['org_o'].isin(gt['org_o']) 过滤掉df['org_o'] 中具有gt['org_o'] 值的行

    并且,用TP 分配tag

    In [5]: df.loc[df['org_o'].isin(gt['org_o']), 'tag'] = 'TP'
    
    In [6]: df
    Out[6]:
              match                   org_o tag
    0        as emt                  AS EMT  TP
    1        as emt  AS EMT Mobile Internet  TP
    2  digitaleffex       DigitalEffex (MH)  TP
    3  digitaleffex            DigitalEffex  TP
    4  digitaleffex                 Digital  FP
    

    我觉得@Shashank 的回答很优雅。一个小的补充是,如果gt['org_o'] 有重复的值,你可以使用唯一的数组来代替。

    df['tag'] = np.where(df['org_o'].isin(gt['org_o'].unique()), 'TP', 'FP')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多