首页 > 解决方案 > 熊猫,根据具有某些值的先前行中的值创建新列

问题描述

嗨,我正在尝试使用 ML 来预测一些未来的销售。所以我想为每种产品添加上个月/上一年的平均销售额

我的 df 类似于:[ id | year | month | product_id | sales ]我想添加prev_month_mean_saleprev_month_id_sale

id | year | month | product_id | sales | prev_month_mean_sale | prev_month_id_sale
----------------------------------------------------------------------
1  | 2018 |   1   |    123     |   5   |         NaN          |    NaN          
2  | 2018 |   1   |    234     |   4   |         NaN          |    NaN
3  | 2018 |   1   |    345     |   2   |         NaN          |    NaN
4  | 2018 |   2   |    123     |   3   |         3.6          |     5 
5  | 2018 |   2   |    345     |   2   |         3.6          |     2 
6  | 2018 |   3   |    123     |   4   |         2.5          |     3 
7  | 2018 |   3   |    234     |   6   |         2.5          |     0 
8  | 2018 |   3   |    567     |   7   |         2.5          |     0 
9  | 2019 |   1   |    234     |   4   |         5.6          |     6 
10 | 2019 |   1   |    567     |   3   |         5.6          |     7 

我还想补充一下prev_year_mean_saleprev_year_id_sale prev_month_mean_sale是上个月总销售额的平均值,例如:第 2 个月是 (5+4+2)/3

我的实际代码是这样的:

for index,row in df.iterrows():

   loc = df.index[(df['month'] == row['month']-1) & 
                  (df['year'] == row['year']) & 
                  (df['product_id'] == row['product_id']).tolist()[0]]

   df.loc[index, 'prev_month_id_sale'] = df.loc[ loc ,'sales']

但它真的很慢而且我的df真的很大。也许还有另一种选择使用groupby()或类似的东西。

标签: pythonpandas

解决方案


避免循环的一种简单方法是使用merge()数据框:

df["prev_month"] = df["month"] - 1
result = df.merge(df.rename(columns={"sales", "prev_month_id"sale"}),
                  how="left",
                  left_on=["year", "prev_month", "product_id"],
                  right_on=["year", "month", "product_id"])

这种result方式将有比您需要的更多的列。你应该drop()其中一些和/或rename()其他一些。


推荐阅读