ValueError: не может индексировать вектор с значениями NA / NaN, произошел с индексом 0 - но я не думаю, что у меня есть какие-либо значения NA - PullRequest
0 голосов
/ 12 декабря 2018

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)
...