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

时间:2015-04-21 18:52:57

标签: python list dictionary pandas comparison

我有一个基本事实数据集'' (有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和wet中,它们与一个组中的相同关键字('匹配'列)匹配。

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

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

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

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

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

我们在此向tag添加新列df。我们正在使用numpy的where函数来检查org_odfgt是否存在TP。如果是,请将tag指定为该行FP的值,否则指定isin

就效率而言,这&#34;查找&#34;效率相当高,因为在使用gt['org_o']时,pandas会将值转换为compare(在本例中为{{1}})into a set,因此查找时间将为O(n * log m)< / p>

答案 1 :(得分:1)

这是一种方法。

最初使用&#39; FP&#39;

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

使用gt['org_o']

df['org_o']中过滤掉df['org_o'].isin(gt['org_o'])个值的行

并指定tagTP

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