熊猫,根据先前行中的某些值创建新列

时间:2019-03-15 14:51:24

标签: python pandas

嗨,我正在尝试使用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是前一个月总销售额的平均值,例如:第二个月为(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()之类的选项。

1 个答案:

答案 0 :(得分:0)

避免循环的一种简单方法是使用数据帧中的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()其他一些。