python - Pandas - 计算总给定范围的百分比

标签 python pandas

我想获得落入某个范围内的速度数据出现的百分比。例如,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/

相关文章:

python - 连接多索引 Pandas 数据帧时出错(分类)

Python:将静态方法分配给类变量会出错

python - Pandas 映射到新列 SettingWithCopyWarning

python - 将 Pandas 多索引数据框 reshape 为多列

python - 处理批量 API 请求的异常

Python:如何使用正则表达式拆分列中的值并保留右侧?

python - 如何在 TensorFlow 中使用模型 Inception.tgz?

python字典键与对象属性

python - 在 pandas/python 中转置 DataFrame,但不是所有列

python - 根据另一个数据框中具有最小/最大值的列从 pandas 数据框中选择值