#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’]