#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)