Зараз у мене є набір даних, який повинен бути нечіткимлогіка приєдналася. Даний кадр df1 є меншою довідковою таблицею з приблизно 10 спостереженнями. Dataframe 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" не виконується
Якщо замінити np.nan на щось інше, я отримаю іншу помилку:
Список поза діапазоном
Відповіді:
1 для відповіді № 1Ви отримуєте TypeError
тому що dataframe 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 правило для "шість").
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]