我有这个数据框架
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
我需要知道如何将列'amount'的单元格乘以值inflation5,当列'month'的值为5,列'condition'的值为"yes",并将列'amount'的单元格乘以值inflation6,当列'month'的值为6,列'condition'的值为"yes",与月7相同。但是我需要第6个月的计算是基于第5个月的新计算值,第7个月的计算是基于第6个月的新计算值。为了更好地解释这一点,值500是一个估计值,需要使用菜单膨胀(累计)来更新。列'amount'的预期输出:[525,200,567,612.36]
感谢我建议使用另一种方法来提高效率。
使用字典来存储膨胀,然后您可以简单地在单个矢量调用中更新:
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
对于这个,我将运行一个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