2015-04-29 3 views
0

Вот мой datafarme «ДФ»:Python панды: Как GroupBy и сравнение столбцов

match   name     group 
adamant   Adamant Home Network 86 
adamant   ADAMANT, Ltd.   86 
adamant bild TOV Adamant-Bild  86 
360works  360WORKS    94 
360works  360works.com   94 

За номером группы Я хочу, чтобы сравнить имена по одному и посмотреть, если они соответствуют одному и тому же слову из столбец «матч».

Так желаемый результат будет отсчеты:

If they match we count it as 'TP' and if not we count it as 'FN'. 

У меня была идея подсчета числа спичечных слов на номер группы, но это не помогло бы полностью с тем, что я хочу:

df.groupby(group).count() 

Значит ли у любого органа есть идея, как это сделать?

+1

Не могли бы вы разместить требуемый выход, спасибо – EdChum

+0

@EdChum I отредактировал вопрос. спасибо – UserYmY

+0

Не могли бы вы объяснить, что вы считаете совпадением, вы просто проверяете, присутствуют ли слова в «match» в «name»? – EdChum

ответ

1

Если я хорошо понимал свой неясный вопрос, это должно сделать работу:

import re 
import pandas 


df = pandas.DataFrame([['adamant', 'Adamant Home Network', 86], ['adamant', 'ADAMANT, Ltd.', 86], 
         ['adamant bild', "TOV Adamant-Bild", 86], ['360works', '360WORKS', 94], 
         ['360works ', "360works.com ", 94]], columns=['match', 'name', 'group']) 


def my_function(group): 
    for i, row in group.iterrows(): 
     if ''.join(re.findall("[a-zA-Z]+", row['match'])).lower() not in ''.join(
       re.findall("[a-zA-Z]+", row['name'])).lower(): 
      # parsing the names in each columns and looking for an inclusion 
      # if one of the inclusion fails, we return 'FN' 
      return 'FN' 
    # if all inclusions succeed, we return 'TP' 
    return 'TP' 


res_series = df.groupby('group').apply(my_function) 
res_series.name = 'count' 
res_df = res_series.reset_index() 
print res_df 

Это даст вам этот DataFrame:

 group  count 
1 86  'TP' 
2 94  'TP' 
+0

. Вы также можете показать результат. – fixxxer

+0

@ user3478208 будет ли этот код работать в Pandas? причина не в том, что мы должны иметь «def» для функций? – UserYmY

+0

Я получаю эту ошибку: AttributeError: объект 'Series' не имеет атрибута 'iterrows' – UserYmY

1

Эта функция сравнения имен и совпадения столбцов по строкам , для каждой поставляемой группы:

def apply_func(df): 
    x = df['name'] == df['match'] 
    return x.map({False:'FIN', True:'TP'}) 

In [683]: temp.join(temp.groupby('group').apply(apply_func).reset_index(), rsuffix='_1', how='left') 
Out[683]: 
      match     name group group_1 level_1 0 
0  adamant Adamant Home Network  86  86  0 FIN 
1  adamant   ADAMANT, Ltd.  86  86  1 FIN 
2 adamant bild  TOV Adamant-Bild  86  86  2 FIN 
3  360works    360WORKS  94  94  3 FIN 
4  360works   360works.com  94  94  4 FIN 
+0

Спасибо за помощь. Но это не то, что я хочу. потому что я хочу сравнивать строки имен друг с другом по количеству групп, поэтому в этом случае, например, я хочу сравнить 360works.com и 360works, чтобы увидеть, есть ли у них одинаковое совпадение – UserYmY

+0

Внутри группы вы хотите совместить на основы строк или столбцов? – fixxxer

+0

ряд основы. поэтому для соответствия трем объектам группы 86 два-два в терминах их слова «матч» – UserYmY