python - Python:基于多个条件聚合和平均行
问题描述
我试图找出平均工作日= 5 天和平均周末= 2 天的平均旅行时间。
我正在尝试汇总并找到具有相同“时间”和相同“Day_type”的所有行的平均车辆时间。因为“时间”值也包括秒,所以我发现匹配属于同一“时间”的所有车辆时间有些麻烦。
我的数据框是按以下方式设置的:
veh-time distance Date Time Day_of_week Day_type
0 72 379.0 2018-10-18 22:15:21 Thursday Weekday
1 72 379.0 2018-10-18 22:30:21 Friday Weekend
2 72 379.0 2018-10-18 22:45:22 Saturday Weekend
3 72 379.0 2018-10-18 23:00:20 Sunday Weekday
4 72 379.0 2018-10-18 23:15:21 Monday Weekday
5 72 379.0 2018-10-18 23:15:21 Tuesday Weekday
6 72 379.0 2018-10-18 23:15:21 Wednesday Weekday
7 72 379.0 2018-10-18 22:15:21 Thursday Weekday
8 72 379.0 2018-10-18 22:30:21 Friday Weekend
9 72 379.0 2018-10-18 22:45:22 Saturday Weekend
10 72 379.0 2018-10-18 23:00:20 Sunday Weekday
11 72 379.0 2018-10-18 23:15:21 Monday Weekday
12 72 379.0 2018-10-18 23:15:21 Tuesday Weekday
13 72 379.0 2018-10-18 23:15:21 Wednesday Weekday
我猜这个过程会是这样的:
第 1 步:
拆分“时间”列,使其仅显示 HH:MM。也许使用regex
或str.split()
第 2 步:将所有匹配 'Time' AND 'Day_type' 的车辆时间行分组 - 例如,所有时间为 22:15 且日期类型为 Weekday 的行
第 3 步:在第 2 步中找到分组行的平均值后添加一个新列:'avg_vt'。avg_vt = veh-time + veh-time etc. / # of Day_type instance identify
谢谢,
R
解决方案
用于transform
由聚合值填充的新列,用于提取用于HH:MM
从右侧拆分仅第一个或转换为日期时间,然后转换为字符串:rsplit
n=1
:
HH:MM
strftime
df['avg_vt'] = df.groupby([df['Time'].str.rsplit(':', n=1).str[0],
'Day_type'])['veh-time'].transform('mean')
选择:
df['avg_vt'] = df.groupby([pd.to_datetime(df['Time']).dt.strftime('%H:%M'),
'Day_type'])['veh-time'].transform('mean')
print (df)
veh-time distance Date Time Day_of_week Day_type avg_vt
0 72 379.0 2018-10-18 22:15:21 Thursday Weekday 72
1 72 379.0 2018-10-18 22:30:21 Friday Weekend 72
2 72 379.0 2018-10-18 22:45:22 Saturday Weekend 72
3 72 379.0 2018-10-18 23:00:20 Sunday Weekday 72
4 72 379.0 2018-10-18 23:15:21 Monday Weekday 72
5 72 379.0 2018-10-18 23:15:21 Tuesday Weekday 72
6 72 379.0 2018-10-18 23:15:21 Wednesday Weekday 72
7 72 379.0 2018-10-18 22:15:21 Thursday Weekday 72
8 72 379.0 2018-10-18 22:30:21 Friday Weekend 72
9 72 379.0 2018-10-18 22:45:22 Saturday Weekend 72
10 72 379.0 2018-10-18 23:00:20 Sunday Weekday 72
11 72 379.0 2018-10-18 23:15:21 Monday Weekday 72
12 72 379.0 2018-10-18 23:15:21 Tuesday Weekday 72
13 72 379.0 2018-10-18 23:15:21 Wednesday Weekday 72
详情:
print (df['Time'].str.rsplit(':', n=1).str[0])
0 22:15
1 22:30
2 22:45
3 23:00
4 23:15
5 23:15
...
Name: Time, dtype: object
推荐阅读
- javascript - Google Maps API 返回空的纬度和经度
- python-3.x - 使用Scrapy抓取多个页面时如何在POST请求上动态更改FormRequest中的页码
- python - 将列宽设置为 wx.dataview.DataViewListCtrl 的最大内容或标题宽度
- php - 卡在 laravel 的缓存世界中
- javascript - 使用 nodemailer 发送电子邮件
- python - Pandas DateTime 索引重采样不起作用
- node.js - NodeJS 的“https”库是否支持 DNS 故障转移?
- javascript - 如果我不知道 JSON 的结构是单个、数组或嵌套的深层结构,请在 JSON 中通过键和值查找对象
- html - Vue JS v-for循环显示图片,字符串插值导致错误
- python - 这段代码的 pygame 部分有什么问题?