Изменение подмножества строк в кадре данных pandas

Предположим, у меня есть pandas DataFrame с двумя столбцами: A и B. Я бы хотел изменить этот DataFrame (или создать копию), чтобы B всегда был NaN, когда A равен 0. Как бы мне это достичь?

Я попробовал следующее

df['A'==0]['B'] = np.nan 

а также

 df['A'==0]['B'].values.fill(np.nan) 

безуспешно.

3 Solutions collect form web for “Изменение подмножества строк в кадре данных pandas”

Попробуй это:

 df.ix[df.A==0, 'B'] = np.nan 

выражение df.A==0 создает df.A==0 серию, которая индексирует строки, а 'B' выбирает столбец. Вы также можете использовать это, чтобы преобразовать подмножество столбца, например:

 df.ix[df.A==0, 'B'] = df.ix[df.A==0, 'B'] / 2 

Я не знаю достаточно о внутренностях pandas, чтобы точно знать, почему это работает, но основная проблема заключается в том, что иногда индексирование в DataFrame возвращает копию результата, а иногда возвращает представление об исходном объекте. Согласно документации здесь , это поведение зависит от основного поведения numpy. Я обнаружил, что доступ к всем в одной операции (а не [один] [два]) с большей вероятностью будет работать для настройки.


Обновить

ix устарела, используйте .loc для индексирования на основе меток

 df.loc[df.A==0, 'B'] = np.nan 

Вот из документов pandas по продвинутому индексированию:

В разделе вы узнаете, что вам нужно! Выключает df.loc (поскольку .ix был устаревшим – как указывали многие из ниже), можно использовать для крутого среза / наложения фреймов. А также. Его также можно использовать для установки вещей.

 df.loc[selection criteria, columns I want] = value 

Поэтому ответ Брен говорит: «Найдите мне все места, где df.A == 0 , выберите столбец B и установите его в np.nan '

Начиная с pandas 0.20 ix устарела . Правильный способ – использовать loc

вот рабочий пример

 >>> import pandas as pd >>> import numpy as np >>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB')) >>> df.loc[df.A == 0, 'B'] = np.nan >>> df AB 0 0 NaN 1 1 0 2 0 NaN >>> 

Объяснение:

Как поясняется в документе здесь , .loc в первую очередь основан на метке, но может также использоваться с булевым массивом .

Итак, что мы делаем выше, применяем df.loc[row_index, column_index] :

  • Используя тот факт, что loc может принимать логический массив как маску, которая сообщает pandas, какое подмножество строк мы хотим изменить в row_index
  • Использование объекта loc также является базой меток, чтобы выбрать столбец, используя метку 'B' в column_index

Мы можем использовать логическое, условие или любую операцию, которая возвращает последовательность логических элементов для построения массива логических элементов. В приведенном выше примере нам нужны любые rows , содержащие 0 , для которых мы можем использовать df.A == 0 , как вы можете видеть в приведенном ниже примере, это возвращает последовательность булевых.

 >>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB')) >>> df AB 0 0 2 1 1 0 2 0 5 >>> df.A == 0 0 True 1 False 2 True Name: A, dtype: bool >>> 

Затем мы используем приведенный выше массив логических элементов для выбора и изменения необходимых строк:

 >>> df.loc[df.A == 0, 'B'] = np.nan >>> df AB 0 0 NaN 1 1 0 2 0 NaN 

Для получения дополнительной информации ознакомьтесь с передовой документацией по индексированию.

  • Смешанные типы элементов в столбце DataFrame
  • python pandas: применить функцию с аргументами к ряду
  • Серии рядов пэндов с элементами не в индексе
  • Как преобразовать электронные таблицы OpenDocument в pandas DataFrame?
  • Объединение словарей из массивов numpy различной длины (избегая, если возможно, ручных петель)
  • Вставьте отсутствующие рабочие дни в кадре данных pandas и заполните их NaN
  • Pandaic способ проверить, имеет ли кадр данных какие-либо строки
  • Новый кадр данных панд из метаинформации существующего DF
  • Морской график рассеяния с отсутствующими точками на рисунке
  • Функция ggplot-ggsave Python не определена
  • Изменение данных в фрейме данных с иерархической индексацией
  • Python - лучший язык программирования в мире.