我目前有一个需要模糊逻辑连接的数据集。数据框 df1 是较小的引用表,包含大约 10 个观测值。数据框 df2 是我的主要数据框,包含大约 2000 个观察值,需要在其中执行模糊逻辑连接。我在下面介绍这个例子和我的尝试。
import difflib
df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']})
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']})
# my approach
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0])
我收到以下错误: 列表超出范围
TypeError: 'float' object is not utterable
如果我用其他东西替换 np.nan,我会收到另一个错误:
List out of range
最佳答案
你得到TypeError
因为数据帧 df2 具有 nan 值,所以您必须删除它。
另一个问题:df1 没有“六”和 df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0])
的规则生成错误 List out of range
因为其中一个列表是空的。
您的代码将如下所示(或者如果您向 df1 添加“六”的规则,则可以使用 your_approach)。
import pandas as pd
import numpy as np
import difflib
df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']})
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']})
# Drop nan value
df2=df2.dropna()
# You cat write [0] because df1 does not have 'six'
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted']))
print df2
输出:
not_shifted values
1 [one] [a]
2 [two] [b]
3 [three] [c]
4 [four] [d]
5 [five] [e]
6 [] [f]
8 [one] [f]
关于Python pandas 模糊逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42427678/