首页 > 解决方案 > 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。也许使用regexstr.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

标签: pythonpandasdataframe

解决方案


用于transform由聚合值填充的新列,用于提取用于HH:MM从右侧拆分仅第一个或转换为日期时间,然后转换为字符串:rsplitn=1:HH:MMstrftime

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

推荐阅读