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

У меня есть этот фрейм данных

import numpy as np
import pandas as pd

data = {'month': ['5','5','6', '7'], 'condition': ["yes","no","yes","yes"],'amount': [500,200, 500, 500]}

и два значения:

inflation5 = 1.05
inflation6 = 1.08
inflation7 = 1.08

Мне нужно знать, как я могу умножить ячейки столбца «сумма» на значение инфляции5, когда значение столбца «месяц» равно 5, а значение столбца «условие» равно «да», а также умножить ячейки столбца «сумма» на значение инфляции6, когда значение столбца «месяц» равно 6, а значение столбца «условие» равно «да», и то же самое с месяцем 7. Но мне нужно, чтобы расчет для месяца 6 основан на новом расчетном значении месяца 5, а расчет для месяца 7 основан на новом расчетном значении месяца 6. Чтобы лучше объяснить это, значение 500 является оценкой, которую необходимо обновить с помощью менструальной инфляции (накопительной). Ожидаемый результат для столбца «сумма»: [525 200, 567, 612,36].

Спасибо

что произойдет, если значение для 6 будет 300? должно ли это изменить итоги месяца 7? а если условие на месяц 6 было no?

mozway 11.05.2022 20:13

Значение для 6 и 7 обязательно должно быть таким же, как для 5. Это связано с тем, что в реальном кадре данных я выполняю оценку для нескольких месяцев на основе месяца 5. Таким образом, на первом этапе значения всех месяцев одинаковы (для клетки, отвечающие условию «да»). На втором этапе мне нужно применить уровень инфляции ко всем последующим месяцам накопительным способом.

Fernando del Valle 11.05.2022 20:35

Хорошо, но я хочу сказать, как мы узнаем, какие значения сочетаются друг с другом? Как это обобщается с большим количеством значений? Проверьте мое обновление и дайте мне знать.

mozway 11.05.2022 20:37
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для этого я бы использовал np.where, чтобы сделать его легко читаемым и расширяемым, особенно если вы хотите изменить условие с помощью функции.

df = pd.DataFrame(data)
df['Inflation'] = np.where((df['month'] == '5') & (df['condition'] == 'yes'), inflation5, 1)
df['Inflation'] = np.where((df['month'] == '6') & (df['condition'] == 'yes'), inflation6, df['Inflation'])
df['Total_Amount'] = df['amount'].values * df['Inflation'].values

Спасибо за ответ, я обновил вопрос, потому что понял, что пропустил один шаг.

Fernando del Valle 11.05.2022 19:53
Ответ принят как подходящий

Я бы предложил использовать другой подход для повышения эффективности.

Используйте словарь для хранения инфляций, затем вы можете просто обновить его одним векторным вызовом:

inflations = {'5': 1.05, '6': 1.08}

mask = df['condition'].eq('yes')
df.loc[mask, 'amount'] *= df.loc[mask, 'month'].map(inflations)

NB. если в словаре отсутствуют месяцы, используйте df.loc[mask, 'month'].map(inflations).fillna(1) вместо df.loc[mask, 'month'].map(inflations)

выход:

  month condition  amount
0     5       yes     525
1     5        no     200
2     6       yes    6480
3     7        no    1873

обновленный вопрос: кумулятивная инфляция

Вы можете создать серию и использовать cumprod:

inflations = {'5': 1.05, '6': 1.08, '7': 1.08}

mask = df['condition'].eq('yes')
s = pd.Series(inflations).cumprod()
df.loc[mask, 'amount'] *= df.loc[mask, 'month'].map(s).fillna(1)

Выход:

  month condition  amount
0     5       yes  525.00
1     5        no  200.00
2     6       yes  567.00
3     7       yes  612.36

Спасибо за ответ, я обновил вопрос, потому что понял, что пропустил один шаг.

Fernando del Valle 11.05.2022 19:53

@Fernando, можете ли вы предоставить ожидаемый результат для ясности?

mozway 11.05.2022 20:11

Спасибо, пожалуйста, также ответьте на комментарии к вопросу, так как это влияет на логику/решение.

mozway 11.05.2022 20:28

Проверьте обновление, но трудно понять, будет ли оно распространяться на ваш реальный набор данных.

mozway 11.05.2022 20:40

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