У меня есть этот фрейм данных
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 и 7 обязательно должно быть таким же, как для 5. Это связано с тем, что в реальном кадре данных я выполняю оценку для нескольких месяцев на основе месяца 5. Таким образом, на первом этапе значения всех месяцев одинаковы (для клетки, отвечающие условию «да»). На втором этапе мне нужно применить уровень инфляции ко всем последующим месяцам накопительным способом.
Хорошо, но я хочу сказать, как мы узнаем, какие значения сочетаются друг с другом? Как это обобщается с большим количеством значений? Проверьте мое обновление и дайте мне знать.
Для этого я бы использовал 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
Спасибо за ответ, я обновил вопрос, потому что понял, что пропустил один шаг.
Я бы предложил использовать другой подход для повышения эффективности.
Используйте словарь для хранения инфляций, затем вы можете просто обновить его одним векторным вызовом:
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, можете ли вы предоставить ожидаемый результат для ясности?
Спасибо, пожалуйста, также ответьте на комментарии к вопросу, так как это влияет на логику/решение.
Проверьте обновление, но трудно понять, будет ли оно распространяться на ваш реальный набор данных.
что произойдет, если значение для
6
будет300
? должно ли это изменить итоги месяца7
? а если условие на месяц6
былоno
?