TypeError: объект 'NoneType' не подлежит подписке при создании словаря pd.Dataframe

Я получаю следующую ошибку: TypeError: объект "NoneType" не может быть подписан

В этом методе я пытаюсь выполнить сопоставление строк в двух файлах (тестовом и главном). Главный файл содержит правильно написанные названия продуктов, в то время как тестовый файл содержит версии этих продуктов с ошибками или просто иначе написанные. Я пытаюсь сопоставить их с функцией extractBests, чтобы включить отсечку по определенному баллу. Также, если я печатаю более ранние этапы вывода, например переменную fhp_new, она все еще работает.

Я думаю, что ошибка как-то вызвана тем фактом, что некоторые строки не дают совпадений, которые находятся в пределах лимита score_cutoff, потому что я не получаю ошибку, когда устанавливаю ограничение, скажем, 20. Так что теоретически эти строки должны просто оставаться пустым, но я думаю, это вызывает ошибку.

Эта строка кода вызывает ошибку:

for x in range (1, num_match + 1):
            d["Match{0}".format(x)] = [y[0] for y in aggregated_matches["Match" + str(x)]]

Это полный код до появления строки ошибки.

def StringMatch (master, testfile, num_match=3, score_cutoff=95, limit=3):
        master_names = master.iloc[:,3]
        test_names = testfile.iloc[:,0]    
        fhp_new = [process.extractBests(x, master_names, score_cutoff=score_cutoff,limit=limit) for x in test_names]
        lab=" "
        i=1

        while i<=num_match:
            lab = lab + " " + "Match" + str(i)
            i = i+1
        aggregated_matches = pd.DataFrame(fhp_new, columns = lab.split())

        d={}
        for x in range (1, num_match + 1):
            d["Match{0}".format(x)] = [y[0] for y in aggregated_matches["Match" + str(x)]]
        print(d)

person Tim    schedule 15.05.2018    source источник
comment
@ user202729 Как бы это сделать? Я все еще новичок и плохо разбираюсь в отладке .. спасибо за вклад!   -  person Tim    schedule 15.05.2018
comment
Я сказал вам проверить, нет ли каких-либо объектов. Если вы хотите узнать, нет ли чего-то, просто распечатайте это. Что случилось? ...   -  person user202729    schedule 15.05.2018
comment
Ошибка сообщает вам, что ваш y равен None, поэтому, вероятно, это не то, что вы думаете. Внутри цикла for попробуйте вывести агрегированное совпадение: for y in aggregated_matches["Match" + str(x)]: print(y). Посмотрите, почему это None.   -  person Bram Vanroy    schedule 15.05.2018
comment
@BramVanroy Итак, для многих матчей это значение None, потому что они не соответствуют моим критериям оценки как минимум 95. Но я все же хотел бы показать это. В результате я хочу, чтобы столбцы соответствовали 1,2,3 и отображали все совпадения, соответствующие этому критерию. Если совпадений не найдено, просто оставьте эту строку пустой или, если это невозможно, перепрыгните через нее. Я предполагаю, что ошибка возникла из-за того, что Python не хочет этого делать, так что это обходной путь, который я искал.   -  person Tim    schedule 15.05.2018


Ответы (1)


Если я вас правильно понял, вы просто хотите проверить y is None:

def StringMatch (master, testfile, num_match=3, score_cutoff=95, limit=3):
        master_names = master.iloc[:,3]
        test_names = testfile.iloc[:,0]    
        fhp_new = [process.extractBests(x, master_names, score_cutoff=score_cutoff,limit=limit) for x in test_names]
        lab=" "
        i=1

        while i<=num_match:
            lab = lab + " " + "Match" + str(i)
            i = i+1
        aggregated_matches = pd.DataFrame(fhp_new, columns = lab.split())

        d={}
        for x in range (1, num_match + 1):
            d["Match{0}".format(x)] = [None if y is None else y[0] for y in aggregated_matches["Match" + str(x)]]
        print(d)
person Bram Vanroy    schedule 15.05.2018
comment
Спасибо за предложение, это было действительно полезно, я смог обойти эту ошибку, теперь он говорит мне, что все массивы должны быть одинаковой длины, поэтому мне нужно найти способ включить эти Nones в массив, не давая мне исходная ошибка. - person Tim; 16.05.2018
comment
@Tim В этом случае вы можете выполнить проверку в понимании списка, т.е. [None if y is None else y[0] for ...] См. Мою правку. - person Bram Vanroy; 16.05.2018
comment
спасибо, тем временем я использовал другое решение, используя .fillna () в фрейме данных и заменив None строкой, но я также протестирую ваше решение. Спасибо! - person Tim; 16.05.2018
comment
протестировал ваше решение, и оно работает по назначению. Еще раз спасибо за вашу поддержку! - person Tim; 16.05.2018