У меня есть DataFrame, и я хочу заменить значения в определенном столбце, которые превышают значение на ноль. Я думал, что это способ добиться этого:
df[df.my_channel > 20000].my_channel = 0
Если я скопирую канал в новый фрейм данных, это просто:
df2 = df.my_channel
df2[df2 > 20000] = 0
Это делает именно то, что я хочу, но, похоже, не работает с каналом как частью исходного DataFrame.
Ответы:
.ix
indexer работает нормально для версий pandas до 0.20.0, но начиная с pandas 0.20.0,.ix
индексатор устарел , поэтому вам следует избегать его использования. Вместо этого вы можете использовать индексаторы.loc
илиiloc
. Решить эту проблему можно следующими способами:Или в одной строке
mask
помогает выбрать строки, в которыхdf.my_channel > 20000
естьTrue
, в то время какdf.loc[mask, column_name] = 0
устанавливает значение 0 для выбранных строк, гдеmask
содержится в столбце с именемcolumn_name
.Обновление: в этом случае вы должны использовать,
loc
потому что, если вы используетеiloc
, вы получитеNotImplementedError
сообщение о том, что логическая индексация на основе iLocation для целочисленного типа недоступна .источник
Пытаться
Примечание. Начиная с версии 0.20.0,
ix
устарел в пользуloc
/iloc
.источник
np.where
функция работает следующим образом:В вашем случае вам нужно:
источник
Причина, по которой ваш исходный фрейм данных не обновляется, заключается в том, что цепное индексирование может привести к изменению копии, а не представления вашего фрейма данных. В документах дают такой совет:
У вас есть несколько альтернатив: -
loc
+ Булево индексированиеloc
может использоваться для установки значений и поддерживает логические маски:mask
+ Булево индексированиеВы можете назначить своей серии:
Или вы можете обновить свою серию на месте:
np.where
+ Булево индексированиеВы можете использовать NumPy, назначив исходную серию, когда ваше условие не выполняется; однако первые два решения более чистые, поскольку они явно изменяют только указанные значения.
источник
Я хотел бы использовать
lambda
функцию наSeries
операторе АDataFrame
как это:Я не утверждаю, что это эффективный способ, но он работает нормально.
источник
loc
здесь, напримерdf.loc[: , 'my_column'] = df['my_column'].map(f)
. Я не знаю, быстро ли это, как те, которые вы добавили ниже.Попробуй это:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
или
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
источник