TypeError: объект 'bool' не поддерживает подписку Python 3

Я получаю следующую ошибку:

TypeError                                 Traceback (most recent call last)
C:\Users\levanim\Desktop\Levani Predictive\cosinesimilarity1.py in <module>()
     39 
     40 for i in meowmix_nearest_neighbors.index:
---> 41     top_ten = pd.DataFrame(similarity_matrix.ix[i,]).sort([i], 
ascending=False[1:6]).index.values
     42     meowmix_nearest_neighbors.ix[i,:] = top_ten
     43 
TypeError: 'bool' object is not subscriptable 

для следующего кода. Я новичок в Python и не могу понять, как мне изменить синтаксис (если это проблема с синтаксисом python 3). Кто-нибудь сталкивался с этим? Я думаю, что это связано с восходящим=False[1:6] частью, и я потратил некоторое время на то, чтобы биться головой о стену. Надеюсь, это простое решение, но недостаточно знаю

import numpy as np
import pandas as pd
from scipy.spatial.distance import cosine


enrollments = pd.read_csv(r'C:\Users\levanim\Desktop\Levani 
Predictive\smallsample.csv')

meowmix = enrollments.fillna(0)

meowmix.ix[0:5,0:5]

def getCosine(x,y) :
    cosine = np.sum(x*y) / (np.sqrt(np.sum(x*x)) * np.sqrt(np.sum(y*y)))
    return cosine

print("done creating cosine function")

similarity_matrix = pd.DataFrame(index=meowmix.columns, 
columns=meowmix.columns)
similarity_matrix = similarity_matrix.fillna(np.nan)

similarity_matrix.ix[0:5,0:5]
print("done creating a matrix placeholder")


for i in similarity_matrix.columns:
    for j in similarity_matrix.columns:
        similarity_matrix.ix[i,j] = getCosine(meowmix[i].values, 
meowmix[j].values)

print("done looping through each column and filling in placeholder with 
cosine similarities")


meowmix_nearest_neighbors = pd.DataFrame(index=meowmix.columns,
                                        columns=['top_'+str(i+1) for i in 
range(5)])

meowmix_nearest_neighbors = meowmix_nearest_neighbors.fillna(np.nan)

print("done creating a nearest neighbor placeholder for each item")


for i in meowmix_nearest_neighbors.index:
    top_ten = pd.DataFrame(similarity_matrix.ix[i,]).sort([i], 
ascending=False[1:6]).index.values
    meowmix_nearest_neighbors.ix[i,:] = top_ten

print("done creating the top 5 neighbors for each item")

meowmix_nearest_neighbors.head()

person meowmixplzdeliver    schedule 02.06.2017    source источник
comment
Что именно вы пытаетесь сделать с False[1:6]?   -  person rm-vanda    schedule 02.06.2017
comment
распечатать 5 самых близких предметов   -  person meowmixplzdeliver    schedule 05.06.2017


Ответы (2)


Вместо

    top_ten = pd.DataFrame(similarity_matrix.ix[i,]).sort([i], 
ascending=False[1:6]).index.values

использовать

    top_ten = pd.DataFrame(similarity_matrix.ix[i,]).sort([i], 
ascending=False), [1:6]).index.values

(т.е. вставьте ), сразу после False.)

False - значение параметра метода sort() со значением "не в порядке возрастания", т.е. е. требуется по убыванию. Таким образом, вам нужно завершить список параметров метода sort() с помощью ), а затем отделить 1-й параметр конструктора DataFrame от 2-го с помощью , .

[1:6] – это второй параметр конструктора DataFrame (индекс, используемый для результирующего кадра).

person MarianD    schedule 02.06.2017
comment
пробовал это: top_ten = pd.DataFrame(similarity_matrix.ix[i,]).sort([i], по возрастанию=False), [1:6]).index.values ​​и получил SyntaxError: неверный синтаксис - person meowmixplzdeliver; 03.06.2017
comment
Опустите этот второй параметр, т.е. е. часть , [1:6], проверьте результат и сообщите, приемлем ли он. - person MarianD; 03.06.2017
comment
ValueError: Должен иметь одинаковые ключи и значение len при настройке с помощью итерируемого - person meowmixplzdeliver; 05.06.2017

Да, вы не можете сделать False[1:6] - False это boolean, то есть это может быть только одна из двух вещей (False или True)

Просто измените его на False и ваша проблема будет решена.

конструкция [1:6] предназначена для работы с lists. Итак, если бы у вас было, например:

theList = [ "a","b","c","d","e","f","g","h","i","j","k","l" ] 

print theList      # (prints the whole list)
print theList[1]   # "b"    
print theList[1:6] # ['b', 'c', 'd', 'e', 'f']

В Python это называется нарезкой и может быть весьма полезным.

Вы также можете делать такие вещи, как:

print theList[6:] # everything in the list after "f" 
print theList[:6] # everything in the list before "f", but including f

Я рекомендую вам поиграть с этим с помощью Jupyter Notebook и, конечно же, прочитать документация

person rm-vanda    schedule 02.06.2017
comment
хе-хе, после взлета [1: 6] я знаю, что получаю ошибку: Должны быть одинаковые ключи len и значение при установке с итерируемым - person meowmixplzdeliver; 03.06.2017
comment
Я полагаю, вы хотели использовать # вместо //? - person Tibebes. M; 16.01.2021
comment
Верно! 3 года, и ты первый, кто это заметил. Благодарю вас! - person rm-vanda; 17.01.2021