python - 没有应用的聚合熊猫数据框
问题描述
我用这个答案来汇总我的数据。
输入数据框(与上面的答案相同):
latitude longitude d1 d2 ar merge_time
0 15 10.0 12/1/1981 0:00 12/4/1981 3:00 2.317681391 1981-12-04 04:00:00
1 15 10.1 12/1/1981 0:00 12/1/1981 3:00 2.293604127 1981-12-01 04:00:00
2 15 10.2 12/1/1981 0:00 12/1/1981 2:00 2.264552161 1981-12-01 03:00:00
3 15 10.3 12/1/1981 0:00 12/4/1981 2:00 2.278556423 1981-12-04 03:00:00
4 15 10.1 12/1/1981 4:00 12/1/1981 22:00 2.168275766 1981-12-01 23:00:00
5 15 10.2 12/1/1981 3:00 12/1/1981 21:00 2.114636628 1981-12-01 22:00:00
6 15 10.4 12/1/1981 0:00 12/2/1981 17:00 1.384415903 1981-12-02 18:00:00
7 15 10.1 12/2/1981 8:00 12/2/1981 11:00 2.293604127 1981-12-01 12:00:00
apply
但是,由于在更大的数据帧上使用,我遇到了巨大的性能问题。我试图在没有的情况下做到这一点apply
,到目前为止,我想出了以下几点:
s = (df["d1"] != (df["d2"].shift() + pd.Timedelta("1H"))).cumsum()
df=(df.groupby(['latitude', 'longitude',s])
.agg(
ar=('ar', 'sum'),
d1=('d1', 'min'),
d2=('d2', 'max')
)
).reset_index(level=-1, drop=True)
,但我得到
ar d1 d2
latitude longitude
15 10.0 2.317681 1981-12-01 00:00:00 1981-12-04 03:00:00
10.1 2.293604 1981-12-01 00:00:00 1981-12-01 03:00:00
10.1 2.168276 1981-12-01 04:00:00 1981-12-01 22:00:00
10.1 2.293604 1981-12-02 08:00:00 1981-12-02 11:00:00
10.2 2.264552 1981-12-01 00:00:00 1981-12-01 02:00:00
10.2 2.114637 1981-12-01 03:00:00 1981-12-01 21:00:00
10.3 2.278556 1981-12-01 00:00:00 1981-12-04 02:00:00
10.4 1.384416 1981-12-01 00:00:00 1981-12-02 17:00:00
我需要的是(与上面的答案相同的请求):
latitude longitude d1 d2 ar
15 10 12/1/1981 0:00 12/4/1981 3:00 2.317681391
15 10.1 12/1/1981 0:00 12/1/1981 22:00 4.461879893
15 10.2 12/1/1981 0:00 12/1/1981 21:00 4.379188789
15 10.3 12/1/1981 0:00 12/4/1981 2:00 2.278556423
15 10.4 12/1/1981 0:00 12/2/1981 17:00 1.384415903
15 10.1 12/2/1981 8:00 12/2/1981 11:00 2.293604127
感谢您在不应用的情况下解决此问题的任何帮助。提前致谢。
解决方案
您想要实现的目标的描述并不完全清楚,但以下给出了预期的输出:
(df.groupby(['latitude', 'longitude', (df['merge_time']-df['d2'])], sort=False)
.agg({'d1': 'min', 'd2': 'max', 'ar': 'sum'})
.droplevel(-1)
.reset_index()
)
输出:
latitude longitude d1 d2 ar
15 10.0 1981-12-01 00:00:00 1981-12-04 03:00:00 2.317681
15 10.1 1981-12-01 00:00:00 1981-12-01 22:00:00 4.461880
15 10.2 1981-12-01 00:00:00 1981-12-01 21:00:00 4.379189
15 10.3 1981-12-01 00:00:00 1981-12-04 02:00:00 2.278556
15 10.4 1981-12-01 00:00:00 1981-12-02 17:00:00 1.384416
15 10.1 1981-12-02 08:00:00 1981-12-02 11:00:00 2.293604
推荐阅读
- mysql - MySQL 工作台无法在 GUI 中显示整数数据类型
- java - Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期
- html - 如何将行和列放在部分的中心
- leaflet - popup.openOn(map) 仅适用于 firefox,不适用于 chrome 或 edge
- javascript - 在对象数组中搜索特定值并返回多个结果
- powershell - 将参数传递到 Jenkins Pipeline 中的 Powershell 脚本
- c++ - Coin3D 裁剪当前视图
- perl - Nagios 插件 check_logfiles postscript 选项无法执行 postscript
- c# - 在两个不同的 Web 服务器上托管使用 IP 地址的 Web 应用程序和 Web API 项目
- macos - 在为多个平台进行 Cordova 构建时,Cordova 添加平台是否应该在特定平台上完成而不是签入?