Изменение подмножества строк в кадре данных 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 

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

  • Pandas интерполирует данные с единицами
  • Groupby на основе значения в предыдущей строке
  • Преобразование кадра данных pandas в ряд
  • Как создать отдельную колонку отслеживания на основе дат?
  • Каков наиболее эффективный способ создания словаря из двух столбцов Pandas Dataframe?
  • Добавить дополнительный столбец как совокупную временную разницу
  • Как установить pandas для Python 3.4 в Windows?
  • Как написать / прочитать Pandas DataFrame с помощью MultiIndex из / в ASCII-файл?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.