#python #pandas #dataframe #if-statement #iteration
#python #pandas #фрейм данных #if-оператор #итерация
Вопрос:
Если у меня есть фрейм данных pandas, такой как:
a b c
1 2 3
1 2 -3
2 3 2
4 2 -1
Как изменить значения столбца b в зависимости от того, являются ли значения в c положительными или отрицательными, и использовать значения в b и a в операции.
Я хочу запустить что-то подобное в каждой строке:
if (c >= 0):
b = a - b
else:
b = b - a
и получить фрейм данных:
a b c
1 -1 3
1 1 -3
2 -1 2
4 -2 -1
Комментарии:
1.
for
может быть, цикл?2. использовать
np.where
:df.assign(b=np.where(df.c.ge(0), df.a - df.b, df.b - df.a))
Ответ №1:
Вы могли бы использовать numpy.where, который похож на if/else
и обычно быстрее:
df.assign(b=np.where(df.c.ge(0), df.a - df.b, df.b - df.a))
a b c
0 1 -1 3
1 1 1 -3
2 2 -1 2
3 4 -2 -1
В качестве альтернативы вы можете использовать метод where от pandas, который предлагает аналогичный подход :
df.assign(b=df.a.sub(df.b).where(df.c.ge(0), df.b - df.a))
a b c
0 1 -1 3
1 1 1 -3
2 2 -1 2
3 4 -2 -1
Комментарии:
1. идеально! Спасибо
Ответ №2:
Вы можете получить тот же результат с помощью pandas.DataFrame.apply
:
df['b'] = df.apply(lambda x: x.a - x.b if x.c >= 0 else x.b - x.a, axis = 1)
# a b c
#0 1 -1 3
#1 1 1 -3
#2 2 -1 2
#3 4 -2 -1
Комментарии:
1. обычно медленнее, чем при использовании встроенных функций в numpy / pandas
2. @sammywemmy Я согласен. было бы неплохо провести сравнение, я не могу сделать это прямо сейчас