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)
我有一个真实数据集 '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)