2015-04-21 3 views
0

У меня есть «GT» Для подспутниковых набора данных (100 записей), который выглядит следующим образом:Python Pandas: Каков наиболее эффективный способ сравнения двух списков в цикле?

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 

, и я хотел бы сравнить его с огромным dataframe «ФР», который выглядит следующим образом:

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

В результате сравнения я хочу, чтобы одна и та же группа с тем же самым org_o существовала в моем df или нет. Таким образом, для каждой группы учитываются как члены группы, так и фактические имена org_o. Так, например, где у нас есть и «Аруба С.П.А.», и "Аруба С.П." в df и ниже они сопоставляются с одним и тем же ключевым словом (столбец «match») в одной группе.

Вот что я сделал, но на самом деле это не то, что я ищу.

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 

Может ли кто-нибудь помочь в этом?

+1

Можете ли вы также опубликовать ожидаемый выход? Другими словами, вы хотите заменить имена 'org_o'' gt' 'из' '' '' '' '' '' '' '' '' '' 'df', а затем взять подсчеты или ..? – Zero

+0

@JohnGalt Я обновил свой вопрос. – UserYmY

+0

Вы сравниваете только значения в первом столбце? Что не так, делая цикл над каждым списком? Время выполнения будет O (n * m), где n и m - размеры каждого списка. –

ответ

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']) into a set, поэтому время поиска будет O (N * журнал м)

1

Вот один из способов сделать это.

Присвоить tag столбец первоначально с 'FP'

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 

I находят ответ @ Shashank элегантным. Небольшое добавление будет в случае, если gt['org_o'] имеет повторяющиеся значения, вы можете взять уникальный массив.

df['tag'] = np.where(df['org_o'].isin(gt['org_o'].unique()), 'TP', 'FP') 
Смежные вопросы