У меня есть 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 новых столбца и затем объединять результат)?
python
pandas
conditional
психопат
источник
источник
apply
и установкаaxis=1
будет работать, не уверен, что я могу придумать операцию, которая дала бы вам то, что вы хотитеdf['C']=df.apply(myFunc(row), axis=1)
где myFunc делает то, что вы хотите, это не связано с созданием «3 столбцов»Ответы:
Чтобы формализовать некоторые из изложенных выше подходов:
Создайте функцию, которая работает со строками вашего фрейма данных следующим образом:
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.
редактировать
Вот векторизованная версия
df['C'] = np.where( df['A'] == df['B'], 0, np.where( df['A'] > df['B'], 1, -1))
источник
args
параметр.apply
функции: pandas.pydata.org/pandas-docs/stable/generated/…data df; set df; if A=B then C=0; else if A>B then C=1; else C=-1; run;
Очень элегантно и просто.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.источник
Для этого конкретного отношения вы можете использовать
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
источник
Допустим, выше один - ваш исходный фрейм данных, и вы хотите добавить новый столбец 'старый'.
Если возраст старше 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"
источник