Python 组内的部分字符串匹配
我的数据包括一个组(区域),然后还提供了一个名称。我正在尝试合并两个数据帧。一个帧小得多,是“映射”数据帧。一个区域内的每个名称都有一行。另一个帧更大,是“实例”数据帧。它有许多行,名称随区域而变化。我希望将映射框架中的信息合并到实例框架中,以便每个实例都具有映射框架为其提供的信息 我研究了Fuzzy包,但没有找到在组(区域列)中实现它的方法,也没有找到如何有效地将它用于包含多个字符串的单元格,并尝试基于这些字符串进行匹配 下面是一个类似的数据样本。合并需要从实例数据框中提取相关信息,以便将其映射到映射数据框 映射数据帧Python 组内的部分字符串匹配,python,merge,matching,fuzzy,fuzzywuzzy,Python,Merge,Matching,Fuzzy,Fuzzywuzzy,我的数据包括一个组(区域),然后还提供了一个名称。我正在尝试合并两个数据帧。一个帧小得多,是“映射”数据帧。一个区域内的每个名称都有一行。另一个帧更大,是“实例”数据帧。它有许多行,名称随区域而变化。我希望将映射框架中的信息合并到实例框架中,以便每个实例都具有映射框架为其提供的信息 我研究了Fuzzy包,但没有找到在组(区域列)中实现它的方法,也没有找到如何有效地将它用于包含多个字符串的单元格,并尝试基于这些字符串进行匹配 下面是一个类似的数据样本。合并需要从实例数据框中提取相关信息,以便将其映
Area Name
A Apple
A Orange Strawberry
A Blackberry Rasberry
B Blackberry
C Kiwi
C Apple
Area Locale
A Apple Pear Tomato
A Orange Potato Strawberry Zuccini
A Blackberry Rasberry
B Blackberry Onion
B Lettuce Blackberry Cucumber
C Kiwi Spinach Pineapple
C Kiwi Potato
C Apple Cucumber
C Apple Potato
实例数据帧
Area Name
A Apple
A Orange Strawberry
A Blackberry Rasberry
B Blackberry
C Kiwi
C Apple
Area Locale
A Apple Pear Tomato
A Orange Potato Strawberry Zuccini
A Blackberry Rasberry
B Blackberry Onion
B Lettuce Blackberry Cucumber
C Kiwi Spinach Pineapple
C Kiwi Potato
C Apple Cucumber
C Apple Potato
目标是得到一个如下所示的框架
数据帧
Area Locale Name
A Apple Pear Tomato Apple
A Orange Potato Strawberry Zuccini Orange Strawberry
A Blackberry Rasberry Blackberry Rasberry
B Blackberry Onion Blackberry
B Lettuce Blackberry Cucumber. Blackberry
C Kiwi Spinach Pineapple Kiwi
C Kiwi Potato Kiwi
C Apple Cucumber Apple
C Apple Potato Apple
使用fuzz和pandas,您可以获得预期的结果 1) 首先收集您的库和数据:
import pandas as pd
from fuzzywuzzy import fuzz
mapping = pd.read_excel('Book1.xlsx', sheet_name='mapping')
instance = pd.read_excel('Book1.xlsx', sheet_name='instance')
2) 创建您所在区域的唯一值列表:
unique_area = instance['Area'].drop_duplicates(keep='first').values.tolist()
3) 创建一个空数据框,并为每个区域运行以下代码:
fuzzed_data = []
for i in unique_area:
instanceunique = instance[instance['Area'] == i]
unique_list = mapping[mapping['Area'] == i]['Name'].drop_duplicates(keep='first').values.tolist()
instance_score = instanceunique[['Locale']]
for i in unique_list:
ratiofuzz = []
for index, row in instance_score.iterrows():
ratiofuzz.append(fuzz.ratio(row['Locale'], i))
instance_score[i] = ratiofuzz
scores = instance_score.drop(['Locale'], axis=1)
instance_score['mapping'] = scores.idxmax(axis=1)
instanceunique = pd.merge(instanceunique
, instance_score[['Locale', 'mapping']]
, how='left'
, on=['Locale'])
fuzzed_data.append(instanceunique)
4) 连接“模糊”数据:
就这样!
如果你需要更多的帮助,请告诉我。
BR感谢您的回复。在运行代码之后,我得到了错误“值的长度与索引的长度不匹配”,我已经尝试过了,它在我这方面起到了作用,与上面给出的示例相同。也许你没有使用相同的数据?另外,请注意最后一部分(pd.concat)在循环之外。您解决了吗?你最后用我的答案了吗?如果我能进一步帮助你,请告诉我!