Метод Pandas «.loc» работает не так, как ожидалось

#pandas #dataframe #.loc

Вопрос:

Почему это работает?

 import pandas as pd

numbers = {'mynumbers': [51, 52, 53, 54, 55]}
df = pd.DataFrame(numbers, columns =['mynumbers'])
df.loc[df['mynumbers'] <= 53, 'mynumbers'] = 'True'
print (df)
 

Выход:

   mynumbers
0      True
1      True
2      True
3     False
4     False
 

Но это возвращает ошибку:

 import pandas as pd

numbers = {'mynumbers': [51, 52, 53, 54, 55]}
df = pd.DataFrame(numbers, columns =['mynumbers'])
print(df.loc[df['mynumbers']])
 

Если в первом случае я могу использовать оператор «df.loc[df[‘mynumbers’]]» в качестве условия для сравнения значений, почему я получаю ошибку, когда просто пытаюсь распечатать только оператор?

Я понимаю, что значения индекса, которые я передаю в метод .loc, приводят к ошибке ключа, потому что такого ключа не существует, но я не понимаю, почему это работает в первую очередь?

Комментарии:

1. Первое условие-это оператор присваивания, после логического индексирования истинные позиции заменяются строкой True , а остальные-Ложными. Если вы проверите типы dtypes, вы заметите, что это тип объекта.

Ответ №1:

При этом df['mynumbers'] <= 53 вы используете логический индексатор, то есть ряд, который имеет тот же индекс, df что и значения и либо True или False как значения:

 >>> df['mynumbers'] <= 53
0     True
1     True
2     True
3    False
4    False
Name: mynumbers, dtype: bool
 

Это может быть передано df.loc[] или df[] :

 >>> df[df['mynumbers'] <= 53]
   mynumbers
0         51
1         52
2         53
>>> df.loc[df['mynumbers'] <= 53, :]
   mynumbers
0         51
1         52
2         53
 

Другой способ использования df.loc[] -передать значения индекса:

 >>> df.loc[df.index]
   mynumbers
0         51
1         52
2         53
3         54
4         55
>>> df.loc[df.index[3:]]
   mynumbers
3         54
4         55
>>> df.loc[[1, 2]]
   mynumbers
1         52
2         53
 

Однако, когда вы это делаете df.loc[df['mynumbers']] , вы не делаете ни одного из этих 2 вариантов. Он пытается найти объект df['mynumbers'] в индексе, как показано в следующей ошибке, и это не работает:

 KeyError: "None of [Int64Index([51, 52, 53, 54, 55], dtype='int64')] are in the [index]"
 

Комментарии:

1. Спасибо за объяснение». df.loc[df[‘mynumbers’]