python - Group by 模糊字符串匹配与fuzzywuzzy 和groupby
问题描述
我有一个随机单词和名称的数据集,我正在尝试对所有相似的单词和名称进行分组。所以给定下面的数据框:
Name ID Value
0 James 1 10
1 James 2 2 142
2 Bike 3 1
3 Bicycle 4 1197
4 James Marsh 5 12
5 Ants 6 54
6 Job 7 6
7 Michael 8 80007
8 Arm 9 47
9 Mike K 10 9
10 Michael k 11 1
我的伪代码将类似于:
import pandas as pd
from fuzzywuzzy import fuzz
minratio = 95
for idx1, name1 in df['Name'].iteritems():
for idx2, name2 in df['Name'].iteritems():
ratio = fuzz.WRatio(name1, name2)
if ratio > minratio:
grouped = df.groupby(['Name', 'ID'])['Value']\
.agg(Total_Value='sum', Group_Size='count')
这会给我想要的输出:
print(grouped)
Name ID Total_Value Group_Size
0 James 1 164 3 # All James' grouped
2 Bike 3 1198 2 # Bike's and Bicycles grouped
5 Ants 6 54 1
6 Job 7 6 1
7 Michael 8 80017 3 # Mike's and Michael's grouped
8 Arm 9 47 1
显然这不起作用,老实说,我不确定这是否可能,但这就是我想要完成的。任何能让我走上正轨的建议都会很有用。
解决方案
使用亲和力传播聚类(不完美,但可能是一个起点):
import pandas as pd
import numpy as np
import io
from fuzzywuzzy import fuzz
from scipy import spatial
import sklearn.cluster
s="""Name ID Value
0 James 1 10
1 James 2 2 142
2 Bike 3 1
3 Bicycle 4 1197
4 James Marsh 5 12
5 Ants 6 54
6 Job 7 6
7 Michael 8 80007
8 Arm 9 47
9 Mike K 10 9
10 Michael k 11 1"""
df = pd.read_csv(io.StringIO(s),sep='\s\s+',engine='python')
names = df.Name.values
sim = spatial.distance.pdist(names.reshape((-1,1)), lambda x,y: fuzz.WRatio(x,y))
affprop = sklearn.cluster.AffinityPropagation(affinity="precomputed", random_state=None)
affprop.fit(spatial.distance.squareform(sim))
res = df.groupby(affprop.labels_).agg(
Names=('Name',','.join),
First_ID=('ID','first'),
Total_Value=('Value','sum'),
Group_Size=('Value','count')
)
结果
Names First_ID Total_Value Group_Size
0 James,James 2,James Marsh,Ants,Arm 1 265 5
1 Bike,Bicycle 3 1198 2
2 Job 7 6 1
3 Michael,Mike K,Michael k 8 80017 3
推荐阅读
- bash - 将 bash 变量与期望一起使用
- python - 通用详细视图索引必须使用 URLconf 中的对象 pk 或 slug 调用
- r - R 更快的替代 str_contains
- c# - 如何 AddRange 许多 IEnumerable 列表
> 进入 IEnumerable - >
- ruby - Nokogiri 刮刀没有正确采购
- java - PostgreSQL 中的参数化查询
- php-7.4 - 我可以在php中将字符串与整数相乘吗?
- flutter - 如何修复“必须向文本小部件提供非空字符串”。颤振错误?
- ios - 当用户按下键盘上的返回按钮时如何关闭键盘?
- django - pytest:如何避免自定义用户管理器测试中的重复