我的数据包含一个组(区域),然后还提供了一个名称。我正在尝试合并两个数据框。一帧要小得多,是“映射”数据帧。区域中的每个名称都有一行。另一帧大得多,是“实例”数据帧。它具有许多行,这些行的名称随区域而异。我希望将映射框架中的信息合并到实例框架中,以便每个实例都具有映射框架所提供的信息。
我研究了Fuzzy包,但是没有找到在组(Area列)中实现它的方法,也没有找到如何有效地将其与包含多个字符串并尝试基于此匹配的单元格一起使用的方法。
下面是类似数据的样本。合并需要从实例数据帧中提取相关信息,以便将其映射到映射数据帧。
映射数据框
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
答案 0 :(得分:0)
使用绒毛和熊猫,您可以获得预期的结果。
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)连接“模糊”数据:
fuzzed_data = pd.concat(fuzzed_data, axis=0)
就是这样! 让我知道您是否需要更多帮助。 BR