如何在Pandas中基于前一行销售额与增长率计算替换目标行销售额?
高效替换Pandas中特定年份的销售额值
基础单分类场景
针对你提供的示例数据,无需循环,可通过以下两种高效方式实现需求:
方式1:精准替换2022年的销售额
直接定位2021年的销售额和2022年的增长率,计算后替换目标值:
import pandas as pd y = pd.DataFrame({ "year": [2018,2019, 2020, 2021, 2022], "sales" : [100, 128, 99, 122, 0], "gth": [0,0,0,0,0.11] }) # 获取2021年销售额和2022年增长率 sales_2021 = y.loc[y['year'] == 2021, 'sales'].iloc[0] gth_2022 = y.loc[y['year'] == 2022, 'gth'].iloc[0] # 替换2022年销售额 y.loc[y['year'] == 2022, 'sales'] = sales_2021 * (1 + gth_2022) print(y)
方式2:通用适配所有销售额为0的年份
如果数据中所有sales=0的行都需要用上一年销售额计算,可结合shift()和np.where()实现向量化替换(效率更高,适合大数据集):
import pandas as pd import numpy as np y = y.sort_values('year') # 确保数据按年份排序 y['sales'] = np.where( y['sales'] == 0, y['sales'].shift(1) * (1 + y['gth']), y['sales'] ) print(y)
多分类场景适配
如果数据集包含多分类(如不同产品/区域),只需通过groupby()按分类分组后,再执行shift()操作即可,同样无需循环:
import pandas as pd import numpy as np # 示例多分类数据 y_multi = pd.DataFrame({ 'category': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 'year': [2018,2019,2020,2021,2022,2018,2019,2020,2021,2022], 'sales': [100,128,99,122,0,80,90,85,95,0], 'gth': [0,0,0,0,0.11,0,0,0,0,0.08] }) # 按分类分组后,对每个组内的销售额做替换 y_multi['sales'] = np.where( y_multi['sales'] == 0, y_multi.groupby('category')['sales'].shift(1) * (1 + y_multi['gth']), y_multi['sales'] ) print(y_multi)
核心优势
上述方法均采用Pandas/Numpy的向量化操作,底层基于C语言实现,比Python原生循环效率提升数倍,完全适配大规模数据集的处理需求。
内容的提问来源于stack exchange,提问作者mg_dev
相关产品推荐
相关产品推荐

