Python Pandas:在循环中比较两个列表的最有效方法是什么?

Python Pandas: What is the most efficient way to compare two lists in a loop?

我有一个真实数据集 '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 名称。因此,例如,我们在 df 中同时拥有 'Aruba S.p.A.' 和 'Aruba S.p.',并且它们是否与一组中的相同关键字('match' 列)匹配。

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

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

最终我想算假positive/negatives。这是预期的输出:

        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

有人可以帮忙吗?

这是一种方法。

最初用 'FP'

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

使用 df['org_o'].isin(gt['org_o'])

过滤掉 df['org_o'] 中具有 gt['org_o'] 值的行

然后,将 tag 列分配给 TP

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')

看来您需要的只是简单的查找 -

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

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

就效率而言,这个"lookup"还是比较有效率的,因为在使用isin的时候,pandas会把值进行转换比较(这里是gt['org_o']) into a set,因此查找时间将为 O(n * log m)