Подтвердить что ты не робот

Создание нового столбца на основе условия 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 новых столбцов и объединения результата)?

4b9b3361

Ответ 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"