Изменить знак значения на основе другого значения столбца

Я хочу изменить знак столбца sum на другое значение столбца apple. Другими словами, всякий раз, когда он видит apple, сумма имеет отрицательное значение. Я думал, что смогу сделать np.where((ef.fruit == 'apple'), (-1 * ef.sum), ef.sum), но это выдало мне ошибку. Как я могу преодолеть это?

import pandas as pd
data = {'id':["ab3e3", "psdds2", "pas13", "ccdf2", "dsda1"],
        'fruit':["apple", "others", "organge", "watermelon", "apple"],
        'sum':[2, 3, 6, 8, 3]}

ef = pd.DataFrame(data)
ef

       id       fruit  sum
0   ab3e3       apple    2
1  psdds2      others    3
2   pas13     organge    6
3   ccdf2  watermelon    8
4   dsda1       apple    3
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
30
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Простым способом сделать это было бы создать маску, где apple соответствует -1, а другие значения соответствуют 1, а затем несколько:

df['sum'] *= np.where(df['fruit'].eq('apple'), -1, 1)

Выход:

>>> df
       id       fruit  sum
0   ab3e3       apple   -2
1  psdds2      others    3
2   pas13     organge    6
3   ccdf2  watermelon    8
4   dsda1       apple   -3

Другим решением было бы использовать .loc:

df.loc[df['fruit'] == 'apple', 'sum'] = -df['sum']

Используя numpy.where:

ef['sum'] *= np.where(ef['fruit'].eq('apple'), -1, 1)

или с индексацией pandas loc:

ef.loc[ef['fruit'].eq('apple'), 'sum'] *= -1

выход:

       id       fruit  sum
0   ab3e3       apple   -2
1  psdds2      others    3
2   pas13     organge    6
3   ccdf2  watermelon    8
4   dsda1       apple   -3
ef.loc[ef["fruit"]= = "apple", "sum"] *= -1

результат:

       id       fruit  sum
0   ab3e3       apple   -2
1  psdds2      others    3
2   pas13     organge    6
3   ccdf2  watermelon    8
4   dsda1       apple   -3
Ответ принят как подходящий

Не называйте свой столбец оригинальной функцией панды, если вы вызываете его через [], а не .

np.where((ef.fruit == 'apple'), (-1 * ef['sum']), ef['sum'])
Out[159]: array([-2,  3,  6,  8, -3], dtype=int64)

Другие вопросы по теме