如何根据两个条件乘以数据帧的单元格值?

How can i multiply a cell value of a dataframe based on two condition?

我有这个数据框

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

我需要知道当 'month' 列的值为 5 且 'condition' 列时,如何将 'amount' 列的单元格乘以值 inflation5值为“yes”,当'month'列的值为6且'condition'列的值为“yes”时,'amount'列的单元格乘以值inflation6 ",与第 7 个月相同。但我需要第 6 个月的计算基于第 5 个月的新计算值,第 7 个月的计算基于第 6 个月的新计算值。 为了更好地解释这一点,值 500 是一个估计值,需要用 mensual inflation(累积)进行更新。 列 'amount' 的预期输出:[525,200, 567, 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

我建议使用不同的方法来提高效率。

使用字典来存储 inflations,然后您可以简单地在单个矢量调用中进行更新:

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

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

注意。如果您可能在字典中缺少月份,请使用 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

更新问题:累计 inflation

您可以制作一个系列并使用 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