Цикл через сгруппированный столбец в пандах - PullRequest
0 голосов
/ 29 мая 2019

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

import pandas as pd
from fuzzywuzzy import fuzz as fz
import itertools

data = [[1,'ab'],[1,'bc'],[1,'de'],[2,'gh'],[2,'hi'],[2,'jk'],[3,'kl'],[3,'lm'],[3,'yz']]
df = pd.DataFrame(data,columns=['Ids','DESCR'])

def iterated(df):
    for a, b in itertools.product(df['DESCR'],df['DESCR']):
        try:
            print(a, b, fz.partial_ratio(a, b), fz.token_set_ratio(a,b))
        except:
            pass
    return result

df.groupby('Ids').apply(iterated(df))

Выше приведено сравнение каждого DESCR со всем списком, а не ограничение каждой группой. Я получаю:

ab ab 100 100
ab bc 50 50
ab de 0 0
ab gh 0 0
ab hi 0 0
ab jk 0 0
ab kl 0 0
ab lm 0 0
ab yz 0 0
bc ab 67 50
bc bc 100 100
bc de 0 0
bc gh 0 0
bc hi 0 0
bc jk 0 0
bc kl 0 0
bc lm 0 0
bc yz 0 0
...

Но это должно быть:

ab bc 50 50
ab de 0 0
bc de 0 0
gh hi 50 50
gh jk 0 0
hi jk 50 50
...

Спасибо.

1 Ответ

1 голос
/ 30 мая 2019

Я думаю, проблема в том, что вы неправильно обрабатываете группы. Вы группируете и затем применяете свою функцию на основе результатов DESCR: whole df с вашей командой .apply(iterated(df)). Кроме того, я думаю, что вы хотите использовать combinations вместо product.

Возможно, вам придется разбить его на части и обрабатывать группы индивидуально. Рассмотрим:

import pandas as pd
import itertools
data = [[1,'ab'],[1,'bc'],[1,'de'],[2,'gh'],[2,'hi'],[2,'jk'],[3,'kl'],[3,'lm'],[3,'yz']]
df = pd.DataFrame(data,columns=['Ids','DESCR'])

def show_combos(df):  #replace with your function...
    combos = itertools.combinations(df.DESCR, 2)
    for c in combos:
        print(c)

groups = df.groupby('Ids')

#iterate through the groups, which are mini-data frames
for name, group in groups:
    print('group name: {}'.format(name))
    show_combos(group)
    print()

Что дает группы, которые вы хотели:

group name: 1
('ab', 'bc')
('ab', 'de')
('bc', 'de')

group name: 2
('gh', 'hi')
('gh', 'jk')
('hi', 'jk')

group name: 3
('kl', 'lm')
('kl', 'yz')
('lm', 'yz')
...