我有一个数据帧,如下所示:
trip_id date journey_duration weekday
0 913460 2019-08-31 00:13:00 Sat
1 913459 2019-08-31 00:17:00 Sat
2 913455 2019-08-31 00:05:00 Sat
3 913454 2019-08-31 00:07:00 Sat
4 913453 2019-08-31 00:13:00 Sat
5 913452 2019-08-31 00:05:00 Sat
6 913451 2019-08-31 00:15:00 Sat
7 913450 2019-08-31 00:04:00 Sat
8 913449 2019-08-31 00:03:00 Sat
9 913448 2019-08-31 00:15:00 Sat
10 913443 2019-08-31 00:12:00 Sat
11 913442 2019-08-31 00:10:00 Sat
12 913441 2019-08-31 00:07:00 Sat
13 913440 2019-08-31 00:05:00 Sat
14 913435 2019-08-31 00:08:00 Sat
15 913434 2019-08-31 00:05:00 Sat
16 913433 2019-08-31 00:03:00 Sat
17 913432 2019-08-31 00:12:00 Sat
18 913431 2019-08-31 00:10:00 Sat
19 913429 2019-08-31 00:15:00 Sat
我想将其汇总到每日级别 - 将trip_id列更改为每天的旅行次数和每天的平均行程持续时间
我用过这个:
trip_data = (pd.to_datetime(trip_data['date'])
.dt.floor('d')
.value_counts()
.rename_axis('date')
.reset_index(name='count'))
这很适用于计算每天的行程,但这会降低行程持续时间
希望这是有道理的,意识到我的命名法可能不存在,因为我是新手
谢谢
这里有一种方法可以完成你的问题:
trip_data.date = pd.to_datetime(trip_data.date)
trip_data.journey_duration = pd.to_timedelta(trip_data.journey_duration)
trip_data = ( trip_data
.assign(date=trip_data.date.dt.floor('d'))
.groupby('date', as_index=False)
.agg(count=("trip_id", "count"), journey_duration=("journey_duration", "mean")) )
输出:
date count journey_duration
0 2019-08-31 20 0 days 00:09:12
解释:
- 确保
date
是熊猫日期时间,journey_duration
是熊猫时间增量类型 - 使用
floor()
将date
四舍五入到其日组件 - 使用
groupby()
准备按唯一date
聚合 - 使用
agg()
聚合名为count
的列中的count
trip_id
,并使用mean
journey_duration
进行聚合。
首先,将date
和journey_duration
转换为日期时间对象。由于journey_duration
不包含日、月等,因此使用pd.to_timedelta
进行转换可能是一个更好的主意:
df['date'] = pd.to_datetime(df['date'])
df['journey_duration'] = pd.to_timedelta(df['journey_duration'])
然后将date
设置为索引,并将数据帧转换为每日频率,并使用agg
对不同列进行多次操作:
df.set_index('date').resample('D').agg(no_trips_per_day=('trip_id', 'count'),
avg_duration=('journey_duration', 'mean'))
no_trips_per_day avg_duration
date
2019-08-31 20 0 days 00:09:12