Создание нового столбца на основе условия if-elif-else
У меня есть DataFrame df
:
A B
a 2 2
b 3 1
c 1 3
Я хочу создать новый столбец на основе следующих критериев:
если строка A == B: 0
если строка A > B: 1
если строка A < B: -1
поэтому, учитывая приведенную выше таблицу, это должно быть:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Для типичных случаев if else
я делаю np.where(df.A > df.B, 1, -1)
, pandas предоставляет специальный синтаксис для решения моей проблемы одним шагом (без необходимости создания 3 новых столбцов и объединения результата)?
Ответы
Ответ 1
Чтобы формализовать некоторые из изложенных выше подходов:
Создайте функцию, которая работает в строках вашего фрейма данных так:
def f(row):
if row['A'] == row['B']:
val = 0
elif row['A'] > row['B']:
val = 1
else:
val = -1
return val
Затем примените его к вашей передаче данных в опции axis=1
:
In [1]: df['C'] = df.apply(f, axis=1)
In [2]: df
Out[2]:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Конечно, это не векторизация, поэтому производительность может быть не такой хорошей, если масштабироваться до большого количества записей. Тем не менее, я думаю, что это гораздо более читаемо. Особенно это происходит из фона SAS.
Ответ 2
df.loc[df['A'] == df['B'], 'C'] = 0
df.loc[df['A'] > df['B'], 'C'] = 1
df.loc[df['A'] < df['B'], 'C'] = -1
Легко решить с помощью индексации. Первая строка кода выглядит следующим образом: если столбец A
равен столбцу B
, то создайте и установите столбец C
равным 0. Примечание. Я не пытался выполнить это, поэтому может потребоваться изменить код к следующему, df.loc[(df['A'] == df['B']), 'C'] = 0
, который использует скобки вокруг условия.
Ответ 3
Для этой конкретной связи вы можете использовать np.sign
:
>>> df["C"] = np.sign(df.A - df.B)
>>> df
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Ответ 4
![enter image description here]()
Допустим, один из них - это ваш исходный фрейм данных, и вы хотите добавить новый столбец "старый"
Если возраст больше 50, то мы считаем его старше = да, в противном случае Неверно
Шаг 1: Получить индексы строк, возраст которых превышает 50
row_indexes=df[df['age']>=50].index
шаг 2:
Используя .loc, мы можем присвоить новое значение столбцу
df.loc[row_indexes,'elderly']="yes"
то же самое для возраста младше 50 лет
row_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"