python - 熊猫,根据具有某些值的先前行中的值创建新列
问题描述
嗨,我正在尝试使用 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
是上个月总销售额的平均值,例如:第 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()
或类似的东西。
解决方案
避免循环的一种简单方法是使用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()
其他一些。
推荐阅读
- tensorflow - Tensorflow - ImportError:DLL加载失败:动态链接库(DLL)初始化例程失败
- c# - 错误 CS0246 找不到类型或命名空间名称“IUnityCompiledFacade”(您是否缺少 using 指令或程序集引用?)
- go - 为什么看不到函数 f 的输出?
- javascript - 将 Props 参数的值设为未定义(ReactJS)
- android - 无法解析 FirebaseInstanceIDService 类中的方法“GetApplicationContext()”
- python - “TypeError: G must be a 'd' matrix”在“cvxpy”中是什么意思?
- angular - Angular 8 Angular Element(自定义 Web 组件)样式
- winapi - 写入内存缓冲区并检查它是否已满并在 Win32 平台上出现 SEH 异常?
- c# - 在当前上下文中不退出的 Linq
- java - 如何解决此错误 - 错误:找不到符号