Создайте новый столбец во фрейме данных pandas, выполняя условные уравнения для определения того, являются ли значения положительными или отрицательными

#python #pandas

Вопрос:

В настоящее время у меня есть фрейм данных panda, который состоит из двух столбцов, столбца «индекс» и столбца «цена», как показано ниже: Фрейм данных Панд

Мне нужно создать новый столбец под названием «Журнал», в котором я хочу выполнить две отдельные операции в зависимости от того, являются ли данные в столбце «Цена» отрицательными или положительными. Для строк, которые являются положительными, мне нужно выполнить следующую операцию:

 df["Log"] = 10**(df['Price'])
 

И если число в столбцах «Цена» отрицательное, выполните приведенную ниже операцию, чтобы получить абсолютное значение этой ячейки:

 df["Log"] = -10**(df['Price'].abs())
 

Не могли бы вы, пожалуйста, показать мне код python, в котором описанные выше операции могут быть выполнены с исходным фреймом данных pandas, где конечный результат должен выглядеть следующим образом:

Окончательная ожидаемая структура фрейма данных

Я включил код для создания исходного фрейма данных ниже:

 # Create dataframe 
cars = {'Index': [1,2,3,4,5,6,7,8,9,10], 
        'Price': [2.266021, 2.160644, -2.266021, 2.103899, 2.019323, 2.134563, 2.193423, 2.495643, 2.129344, 2.876545]
        }

df = pd.DataFrame(cars, columns = ['Index', 'Price'])

print (df)
 

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

1. См np.where() .раздел и для более сложных условных операций np.select() .

2. Вы действительно хотите увеличить цену в геометрической прогрессии и назвать ее логарифмом? Это противоположности друг друга.

Ответ №1:

Попробуйте с np.where

 import numpy as np 

df["Log"] = np.where(df.Price<0, -10**(df['Price'].abs()), 10**(df['Price']))
 

Ответ №2:

Для положительных чисел df['Price'].abs() это то же самое, что и просто df['Price'] . Это может быть выражено без каких-либо условий:

 df["Log"] = np.sign(df['Price']) * (10**df['Price'].abs())