TLDR: я получаю ValueError: («не могу индексировать вектором, содержащим значения NA / NaN», «произошел с индексом 0»), но я не думаю, что у меня есть какие-либо значения NA.
Ввод:
df_raw:
StatCat
24.117
24.118&3
24.118&1
ArrestTable:
StauteCat Lev
24.117 M
24.118&1 F
24.118&2 F
24.118&3a O
Желаемый вывод
StatCat StatLev
24.117 M
24.118&3 O
24.118&1 F
Я хочу найти строку из df ["StatCat"]в ArrestTable ["StatuteCat"] и вернуть строку в столбце ArrestTable ["Lev"].В конечном итоге это будет сделано и для нескольких других столбцов.Поскольку записи не всегда точны при написании номера статута в StatCat, это должно быть нечеткое логическое совпадение.
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
def find_law(row):
abbrev = process.extractOne(df_raw["StatCat"][row],choices=ArrestTable["StatuteCat"],score_cutoff=80)
if abbrev:
#print(df_raw["StatCat"][row])
#print(abbrev[0])
return ArrestTable[ArrestTable['StatuteCat'] == abbrev[0]]["Lev"].item()
return np.nan
Я выполняю некоторые манипуляции с регулярными выражениями / строками, чтобы получить их в общем формате для поиска.
df_raw[['StatuteNum','StatSub']] = df_raw["Statute"].str.split('\(|\)', expand=True, n=1).iloc[:,[0,1]]
df_raw["StatSub"] = df_raw["StatSub"].str.replace("(","")
df_raw["StatSub"] = df_raw["StatSub"].str.replace(")","")
df_raw["StatSub"] = df_raw["StatSub"].str.lower()
df_raw["StatCat"] = df_raw["StatuteNum"].map(str) + "&" + df_raw["StatSub"]
Я пытался заполнить так, чтобы не было значений n ...
df_raw["StatSub"] = df_raw["StatSub"].fillna("")
df_raw["StatuteNum"] = df_raw["StatuteNum"].fillna("")
df_raw["StatCat"] = df_raw["StatCat"].fillna("")
df_raw["StatLev"] = df_raw.apply(find_law, axis=1)
#I don't think I can simply map due to the minor text differences in the statue number, it returns NA ~ 25% of the time.
#df_raw["StatLev"] = df_raw["StatCat"].map(ArrestTable.set_index('StatuteCat')["Lev"])
df_raw[180:190].T
Я получаю ValueError:
ValueError: ('cannot index with vector containing NA / NaN values', 'occurred at index 0')
---> 12 df_raw["StatLev"] = df_raw.apply(find_law, axis=1)
[...]
4 def find_law(row):
----> 5 abbrev = process.extractOne(df_raw["StatCat"][row],choices=ArrestTable["StatuteCat"],score_cutoff=80)
РЕДАКТИРОВАТЬ: Этоработает нормально, хотя медленно:
for i in range(20):
tempvar = find_law(i)
print(tempvar)