DataFrame 组循环替代方案?
我有一个包含 1300 万行、1,214 个站点(唯一 ID)的数据集:
# copy the data to the clipboard, and read in with
df = pd.read_clipboard(sep=',', index_col=[0])
,tmc_code,measurement_tstamp,travel_time_minutes
0,133-04199,2019-01-01 18:15:00,2.01
1,133-04199,2019-01-01 18:20:00,2.01
2,133-04198,2019-01-01 18:25:00,9.23
3,133-04191,2019-01-01 20:35:00,2.88
4,133-04191,2019-01-01 20:40:00,2.62
5,133-04190,2019-01-01 20:40:00,1.3
6,133-04193,2019-01-01 20:20:00,4.96
7,133-04193,2019-01-01 20:25:00,4.96
8,133-04192,2019-01-01 20:30:00,5.05
9,133-04192,2019-01-01 20:35:00,5.14
10,133-04195,2019-01-01 19:45:00,9.52
11,133-04195,2019-01-01 19:50:00,10.69
12,133-04195,2019-01-01 19:55:00,9.37
13,133-04194,2019-01-01 20:10:00,5.96
14,133-04194,2019-01-01 20:15:00,5.96
15,133-04194,2019-01-01 20:20:00,5.96
16,133P04359,2019-01-01 22:25:00,0.66
17,133P04359,2019-01-01 22:30:00,0.78
18,133P04359,2019-01-01 23:25:00,0.8
19,133P04126,2019-01-01 23:10:00,0.01
20,133P04125,2019-01-01 23:10:00,0.71
有一些极端的最大值在物理上是不可能的,因此为了修剪它们,我尝试使用95 百分位数加上模式来创建阈值并过滤掉极端值。
站点会产生不同的 Travel_time 值(由于长度/交通模式),因此百分位数和众数必须按站点计算。
这可行,但速度非常慢。
df_clean_tmc = df.groupby(['tmc_code'], as_index=False)['travel_time_seconds'].apply(lambda x: x[x['travel_time_seconds']
< (x['travel_time_seconds'].quantile(.95)
+ x['travel_time_seconds'].apply(lambda x: stats.mode(x)[0]))])
我也尝试过这个,但速度很慢,并且结果没有执行任何计算,它与原始数据帧的大小相同。
我怀疑第二个应用是错误的,但是 groupby 对象没有“模式”功能,并且 stats.mode 在各个 groupby 测试中正常工作。
我也尝试过这个:
df_clean_tmc = df.groupby(['tmc_code'], as_index=False)
np.where(df_clean_tmc['travel_time_seconds']
< (df_clean_tmc['travel_time_seconds'].quantile(.95)
+ df_clean_tmc['travel_time_seconds'].apply(lambda x: stats.mode(x)[0]),df['travel_time_seconds']))
但出现类型错误:
TypeError: '<' not supported between instances of 'DataFrameGroupBy' and 'tuple'
什么是更有效、更合适的方法来实现这一目标?
qq_笑_17
相关分类