Как применить функцию к строке фрейма данных на основе условия и значений другой строки?

#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 Я согласен. было бы неплохо провести сравнение, я не могу сделать это прямо сейчас