У меня есть dask dataframe
сгруппированный по индексу (first_name
).
import pandas as pd
import numpy as np
from multiprocessing import cpu_count
from dask import dataframe as dd
from dask.multiprocessing import get
from dask.distributed import Client
NCORES = cpu_count()
client = Client()
entities = pd.DataFrame({'first_name':['Jake','John','Danae','Beatriz', 'Jacke', 'Jon'],'last_name': ['Del Toro', 'Foster', 'Smith', 'Patterson', 'Toro', 'Froster'], 'ID':['X','U','X','Y', '12','13']})
df = dd.from_pandas(entities, npartitions=NCORES)
df = client.persist(df.set_index('first_name'))
(Очевидно, entities
в реальной жизни - несколько тысяч строк)
Я хочу применить определенную пользователем функцию к каждому сгруппированному кадру данных. Я хочу сравнить каждую строку со всеми остальными строками в группе (что-то похожее на Pandas, сравнивает каждую строку со всеми строками в кадре данных и сохраняет результаты в списке для каждой строки).
Следующей является функция, которую я пытаюсь применить:
def contraster(x, DF):
matches = DF.apply(lambda row: fuzz.partial_ratio(row['last_name'], x) >= 50, axis = 1)
return [i for i, x in enumerate(matches) if x]
Для кадра данных тестовых entities
вы можете применить функцию как обычно:
entities.apply(lambda row: contraster(row['last_name'], entities), axis =1)
И ожидаемый результат:
Out[35]:
0 [0, 4]
1 [1, 5]
2 [2]
3 [3]
4 [0, 4]
5 [1, 5]
dtype: object
Когда entities
огромны, в решении используется использование dask
. Обратите внимание, что DF
в функции contraster
должен быть групповым файловым кадром.
Я пытаюсь использовать следующее:
df.groupby('first_name').apply(func=contraster, args=????)
Но как мне указать сгруппированный фрейм данных (т.е. DF
в contraster
?)