Как рассчитать функцию между каждой парой строк в группе данных pandas - PullRequest
0 голосов
/ 16 марта 2020

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

product, city, value
a, 1, str1
a, 1, str2
a, 1, str3
a, 2, str4
a, 2, str5
a, 2, str6

предположим, что моя функция вычисляет сходство в строках, затем я хочу вычислить сходство между str1, str2 и str1, str3 и дать максимальное значение в качестве нового столбца для первой строки. Сходство между str2, str1 и str2, str3 и дают максимальное значение в качестве нового столбца для второй строки и т. Д. Для каждой группы продуктов, город.

1 Ответ

0 голосов
/ 16 марта 2020

Попробуйте это:

По сути, мы перебираем каждую строку в каждой группе и вычисляем сходство, используя SequenceMatcher между значением этой строки и всеми другими строками в этой группе и присваивая максимальное значение новой колонка - здесь это достигается двумя лямбда-функциями - одна для внешней l oop, а другая для внутренней l oop

df = pd.DataFrame([['a', 1, 'str1'],
                   ['a', 1, 'st2'],
                   ['a', 1, 'str3'],
                   ['a', 1, 'str10'],
                   ['a', 2, 'str4'],
                   ['a', 2, 'str5'],
                   ['a', 2, 'str6']],
                  columns=['product', 'city', 'value'])

def func(grp):
    def match(id, val):    
        matches = grp.drop(id).apply(lambda x: difflib.SequenceMatcher(None, x['value'], val).ratio(), axis=1)
        return max([x for i, x in enumerate(matches) if x])

    return grp.apply(lambda row: match(row.name, row['value']), axis=1)


res = df.groupby(['product', 'city']).apply(func).reset_index()
res['level_2'] = df['value']
res.rename(columns={'level_2':'value'}, inplace=True)

print(res)

Вывод:

  product  city  value         0
0       a     1   str1  0.888889
1       a     1    st2  0.571429
2       a     1   str3  0.750000
3       a     1  str10  0.888889
4       a     2   str4  0.750000
5       a     2   str5  0.750000
6       a     2   str6  0.750000
...