фильтрация данных в пандах с использованием и без использования .loc - PullRequest
0 голосов
/ 09 октября 2019

У меня есть простой вопрос относительно концепции фильтрации кадра данных. Предположим, у меня есть следующий фрейм данных:

df = pd.DataFrame({'AAA': [4, 5, 6, 7],'BBB': [10, 20, 30, 40],'CCC': [100, 50, -30, -50]})

df

Я хотел бы внести в него некоторые изменения в зависимости от условий. Если я запускаю приведенный ниже код, я получаю желаемую строку:

Метод a

df[(df.AAA <= 5) & (df.BBB <= 10)]

a

Я также могу получить эту строку с кодом ниже:

Метод b

df.loc[(df.AAA <= 5) & (df.BBB <= 10)]

b

ОбаМетода А и Метода b, в результате чего получился кадр данных панд. Однако, когда я хочу изменить столбец «CCC» на основе этих условий, я получаю сообщение об ошибке «Метод a»:

Метод a

df[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1

Объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать

Метод b

df.loc[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1

b-1

1 Ответ

1 голос
/ 09 октября 2019

Если необходимо установить новые значения по маске, а также по имени столбца, DataFrame.loc всегда необходимо, потому что здесь выбирается имя столбца CCC:

df.loc[(df.AAA <= 5) & (df.BBB <= 10), 'CCC'] = -1
print (df)
   AAA  BBB  CCC
0    4   10   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

При необходимостидля установки нескольких столбцов используйте loc и список имен столбцов:

df.loc[(df.AAA <= 5) & (df.BBB <= 10), ['CCC', 'AAA']] = -1
print (df)
   AAA  BBB  CCC
0   -1   10   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

Но если необходимо установить все столбцы, удалите loc, а также имя столбца:

df[(df.AAA <= 5) & (df.BBB <= 10)] = -1
print (df)
   AAA  BBB  CCC
0   -1   -1   -1
1    5   20   50
2    6   30  -30
3    7   40  -50

РЕДАКТИРОВАТЬ:

Решение из комментария работает:

df['CCC'][(df.AAA <= 5) & (df.BBB <= 10)] = -1 

, но не рекомендуется, потому что этот код приводит к возможным SettingWithCopyWarning .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...