我想获得落入某个范围内的速度数据出现的百分比。例如,5% 的速度数据在 0 到 5 之间,10% 在 5 到 10 之间,等等。我还希望能够将输出重新采样为任何频率(整个周期、每天、每月等)
我有一个如下所示的 DataFrame:
df = pd.DataFrame({'id': '1234',
'datetime': pd.date_range('2017-01-01', '2018-01-01', freq='H'),
'speed': np.random.randint(0, 5000, df.shape[0])})
df['speed'] = df['speed'] / 100.0
speedintervals = [0,3,5,9,15,21]
frequency = 'D' # for daily aggregation of data
# or frequency = 'P' for entire period
DataFrame 看起来像这样:
datetime id speed
0 2017-01-01 00:00:00 1234 17.08
1 2017-01-01 01:00:00 1234 16.30
2 2017-01-01 02:00:00 1234 12.74
3 2017-01-01 03:00:00 1234 39.89
4 2017-01-01 04:00:00 1234 34.33
5 2017-01-01 05:00:00 1234 22.76
6 2017-01-01 06:00:00 1234 13.72
...
我想象我将日期时间设置为索引并进行各种重新采样,但不确定如何构建数据。最终,我希望数据看起来像这样:
整个时期:
id start_date end_date 0<=3 3<=9 9<=15 15<=21 >21
1234 1/1/17 0:00 1/1/18 23:00 0.49 0.13 0.18 0.17 0.00
每日频率:
id periodEnd 0<=3 3<=9 9<=15 15<=21 >21
1234 1/1/18 0.49 0.13 0.18 0.17 0.00
1234 1/2/18 0.50 0.14 0.17 0.16 0.00
1234 1/3/18 0.25 0.10 0.25 0.25 0.15
...
有什么想法吗?
最佳答案
这是一种方法。
speedintervals = [0,3,5,9,15,21,100]
df["interval"] = pd.cut(df["speed"],bins=speedintervals)
result = (df.groupby([pd.Grouper(key="datetime",freq="D"),"interval"])["interval"].count()
.unstack(0).T.fillna(0)
)
- 将 100 添加到您的列表中以捕捉高速。
- 然后使用 cut 方法将速度分组到区间中
- 按日期时间分组,然后按间隔分组,然后计数
- 这会创建一个多重索引,所以你必须将它拆开才能得到 你想要的格式。
您可以使用数据透视表而不是分组依据,但最好对日期使用分组。
如果你想要归一化的结果,你可以这样做
result.div(result.sum(axis=1),axis="rows")
整个时间段
pd.cut(df["speed"],bins=speedintervals).value_counts()
关于python - Pandas - 计算总给定范围的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48409237/