Многочисленные логические сравнения в пандах df - PullRequest
0 голосов
/ 02 мая 2018

Если у меня есть следующие панды df

A   B   C   D
1   2   3   4
2   2   3   4

и я хочу добавить новый столбец, равный 1, 2 или 3, в зависимости от

(A > B) && (B > C) = 1
(A < B) && (B < C) = 2
Else = 3

Какой лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

вы можете использовать apply на df с двумя вашими условиями, такими как:

df['E'] = df.apply(lambda x: 1 if x.A > x.B and x.B > x.C else 2 if x.A < x.B and x.B < x.C else 3, axis=1)
0 голосов
/ 02 мая 2018

Это также можно решить с помощью индексации и заполнения.

df.loc[(df['A'] > df['B'])
  &(df['B'] > df['C']), 'New_Col'] = 1

df.loc[(df['A'] < df['B'])
  &(df['B'] < df['C']), 'New_Col'] = 2

df['New_Col'] = df['New_Col'].fillna(3)

Первый фрагмент кода читается так: найдите, где A> B и B> C, если оба эти условия выполняются, установите столбец 'New_Col' равным 1. Второй фрагмент можно интерпретировать в том же самом путь. Если и первый, и второй чанк не возвращают 1 или 2, они будут отображаться как ноль. Используйте функцию fillna (), чтобы заполнить эти нули значением 3.

Это создаст следующий фрейм данных:

enter image description here

0 голосов
/ 02 мая 2018

Вы можете использовать numpy.select для структурирования нескольких условий. Последний параметр представляет значение по умолчанию.

conditions = [(df.A > df.B) & (df.B > df.C),
              (df.A < df.B) & (df.B < df.C)]

values = [1, 2]

df['E'] = np.select(conditions, values, 3)

Существует несколько альтернатив: вложенные numpy.where, последовательные pd.DataFrame.loc, pd.DataFrame.apply. Основным преимуществом этого решения является удобочитаемость при сохранении векторизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...