嗨,我正在尝试使用ML预测未来的销售量。因此,我想添加每种产品上个月/一年的平均销售额
我的df类似于:[ id | year | month | product_id | sales ]
我想添加prev_month_mean_sale
和prev_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_sale
和prev_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()
之类的选项。
答案 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()
其他一些。