python - 如何根据多列中的多个条件计算/求和值
问题描述
我有一个大约有一个运输记录表。100K 行,我想计算每行、每种材料在过去 30 天内运送了多少数量。正如您在下面的示例中看到的,计算的数量取决于“材料、发货日期”。我尝试编写非常基本的代码,但找不到将其应用于所有行的方法。
df[(df['malzeme']==material) & (df['cikistarihi'] < shippingDate) & (df['cikistarihi'] >= (shippingDate-30))]['qty'].sum()
材料 | 发货日期 | 数量 | 最近 30 天内发货的数量 |
---|---|---|---|
一个 | 23.01.2019 | 8 | 0 |
一个 | 28.01.2019 | 41 | 8 |
一个 | 31.01.2019 | 66 | 49 (8+41) |
一个 | 20.03.2019 | 67 | 0 |
乙 | 17.02.2019 | 53 | 0 |
乙 | 26.02.2019 | 35 | 53 |
乙 | 11.03.2019 | 4 | 88 (53+35) |
乙 | 20.03.2019 | 67 | 106 (35+4+67) |
解决方案
您可以.groupby
使用.rolling
:
# convert the shippingData to datetime:
df["shippingDate"] = pd.to_datetime(df["shippingDate"], dayfirst=True)
# sort the values (if they aren't already)
df = df.sort_values(["material", "shippingDate"])
df["shipped qtys in last 30 days"] = (
df.groupby("material")
.rolling("30D", on="shippingDate", closed="left")["qty"]
.sum()
.fillna(0)
.values
)
print(df)
印刷:
material shippingDate qty shipped qtys in last 30 days
0 A 2019-01-23 8 0.0
1 A 2019-01-28 41 8.0
2 A 2019-01-31 66 49.0
3 A 2019-03-20 67 0.0
4 B 2019-02-17 53 0.0
5 B 2019-02-26 35 53.0
6 B 2019-03-11 4 88.0
7 B 2019-03-20 67 39.0
编辑:.sort_values()
在 groupby 之前添加
推荐阅读
- asp.net-core - AuthorizeFilter 如何与应用于页面的 AuthorizeAttribute 一起工作?
- azure - Azure Bot Framework 注册上的“启用流式处理终结点”有什么作用?
- sql - CHAR_INT 和 INT 主键之间的查询速度差异很大吗?
- python - 熊猫多个箱线图 - 如何减少地块之间的间距?
- python - 重塑 Nd 阵列的麻烦
- java - 从片段中的选定 RadioButton 获取值
- node.js - docker 容器 bash 和最终用户之间的微服务中继
- r - 使用哪种方法在 R 中的 greenbrown 包中计算趋势?
- apache-spark - Hive - 使用分区复制数据库模式并在另一个 hive 实例中重新创建
- laravel - 如何在发送到视图之前挂钩 Laravel 请求错误?有什么方法可以限制独特的错误?