Вычислить новый столбец в pandas, используя условие для других столбцов

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом

 pd.DataFrame({'A': [5, 2, -3, -2, 1],
   ...:                    'B': [9, -1, 7, -4, 3],
   ...:                    'C': [-5, 2, -6, -8, 9]})
Out[21]: 
   A  B  C
0  5  9 -5
1  2 -1  2
2 -3  7 -6
3 -2 -4 -8
4  1  3  9
  

Для каждого значения столбца > 0 я хочу добавить 1, а для каждого значения столбца < 0 я хочу вычесть 1 перед суммированием всех столбцов.

результирующий фрейм данных должен выглядеть следующим образом

    A  B  C   D   Logic
0  5  9 -5  10   (5 1) (9 1) (-5-1)
1  2 -1  2   4   (2 1) (-1-1) (2 1)
2 -3  7 -6  -3
3 -2 -4 -8 -17
4  1  3  9  16
  

какой самый простой / быстрый способ добиться этого?

Ответ №1:

Вы можете сделать:

 df['D'] = df.add(np.where(df>0, 1, -1)).sum(axis=1)

print(df)

   A  B  C   D
0  5  9 -5  10
1  2 -1  2   4
2 -3  7 -6  -3
3 -2 -4 -8 -17
4  1  3  9  16
  

Объяснение

Создайте массив из 1 и -1, который можно добавить в фрейм данных с помощью add :

 >>> np.where(df>0, 1, -1)

array([[ 1,  1, -1],
       [ 1, -1,  1],
       [-1,  1, -1],
       [-1, -1, -1],
       [ 1,  1,  1]])
  

Комментарии:

1. хорошо, df.add более лаконично 🙂 1. Я, вероятно, удалю свой ответ. Кстати, это не я

2. Спасибо. что, если я не хочу добавлять 1, но делаю следующее (1 5) (1 9) (1-5). логика для моей первой строки. таким образом, в зависимости от того, значение > 0 или <0, требуется значение 1 или 1-значение

3. @idt_tt тогда вы просто делаете df.add(1).sum(axis=1)

4. @YOLO вы правы. моя проблема немного сложнее, хотя для x<0 мне нужно (1-x) ^-1 (в степени -1) любое простое решение здесь?

5. @idt_tt итак, для строки 1, каков будет ожидаемый ответ, будет ли это 10 16-7?

Ответ №2:

В Numpy есть метод с именем numpy.sign , который преобразует положительное число в 1, а отрицательное — в -1.

 df['D'] = df.add(np.sign(df)).sum(axis=1)