Правильный синтаксис where()

Подскажите правильный синтаксис. Нужно по условию внутри функции where() заполнить новый столбец new.

df['new']  = df.where(df['first'] > df['second'], 'Первый')

Ошибка

ValueError: Expected a 1D array, got an array with shape (23699, 26)


Ответы (1 шт):

Автор решения: strawdog

Синтаксис pandas DataFrame.where предполагает замену существующих значений по условию. При этом замена происходит только, если условие НЕ выполняется. Это значит, что при выполнении метода where возвращаются только измененные значения, а те, которые не попали под условие - не возвращаются. Из-за этого размерность возвращаемого фрейма или серии не совпадает с начальной размерностью.

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

import pandas as pd
import numpy as np

df = pd.DataFrame({"a":[1,0,0,1]})

df:

   a
0  1
1  0
2  0
3  1

теперь:

df["new"]=pd.NA
df["new"] = df["new"].where(df["a"]!=0, "bar")

df:

   a   new
0  1  <NA>
1  0   bar
2  0   bar
3  1  <NA>

При использовании же numpy where можно обойтись без инициализации колонки заранее:

import numpy as np

df["new"] = np.where(df["a"]!=0, np.nan, "bar")

df:

   a  new
0  1  nan
1  0  bar
2  0  bar
3  1  nan
→ Ссылка