【发布时间】:2018-08-27 15:46:32
【问题描述】:
我有一个按索引 (first_name) 分组的 dask dataframe。
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 compare each row with all rows in data frame and save results in list for each row)。
以下是我尝试应用的功能:
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。注意contraster函数中的DF必须是分组数据框。
我正在尝试使用以下内容:
df.groupby('first_name').apply(func=contraster, args=????)
但我应该如何指定分组数据框(即contraster 中的DF?)
【问题讨论】:
-
嗨,你能提供
entities的样本吗? -
我刚刚编辑了这个问题。谢谢@mortysporty
-
你好。您能否澄清一下...当您按名字分组时。这样做的目的是什么?例如,如果您有 1000 个名为 Jane 的人,他们的姓氏不同且相似,您希望得到什么输出?您想比较名字相同和姓氏相似的每个人吗?
-
我试图解决的问题是“重复数据删除”一种特殊类型的“记录链接”。将所有行与以二次方增长的所有行进行比较。所以是不可行的。标准方法是“阻塞”,即将记录分成块,只在块内进行比较。为了这个问题,阻止一个确切的列是一种简化。
-
你能让实体成为全局变量吗?那么你在使用apply的时候就不需要传递任何东西了。