我有一个基本事实数据集'' (有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
任何人都可以帮忙吗?
答案 0 :(得分:2)
看起来你需要的是简单的查找 -
df['tag'] = np.where(df['org_o'].isin(gt['org_o']), 'TP', 'FP')
我们在此向tag
添加新列df
。我们正在使用numpy的where函数来检查org_o
中df
中gt
是否存在TP
。如果是,请将tag
指定为该行FP
的值,否则指定isin
。
就效率而言,这"查找"效率相当高,因为在使用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'])
个值的行
并指定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')