首页 > 解决方案 > PANDAS:按 ID 计算高于阈值的行数

问题描述

我目前无法确定一种方法来计算记录数,即按包含标识符的列,其中数字高于阈值,每天。

即:对于每一天,在位置 1,有多少行/记录中的“温度”高于值 20?如果一天不包含大于 20 的值,则结果应为 0。结果应位于新数据框中。

DateTime 作为 Pandas datetime64[ns] 对象存在。

我有大约 1000 万行要处理,并且预计这将是一个常规查询 - 所以不介意坚持使用 pandas 矢量化方法(即 lambda 可能不是一个好的选择)。

示例数据:此处为 csv

Name: df
+----------+-----------------+------+
| Location |    DateTime     | Temp |
+----------+-----------------+------+
|        0 | 3/03/2021 7:00  |    5 |
|        0 | 3/03/2021 8:00  |   10 |
|        0 | 3/03/2021 9:00  |   15 |
|        0 | 3/03/2021 10:00 |   10 |
|        0 | 3/03/2021 11:00 |   15 |
|        0 | 3/03/2021 12:00 |   20 |
|        0 | 3/03/2021 13:00 |   20 |
|        0 | 4/03/2021 8:00  |   25 |
|        0 | 4/03/2021 10:00 |   15 |
|        0 | 4/03/2021 12:00 |   10 |
|        0 | 4/03/2021 13:00 |   10 |
|        0 | 4/03/2021 15:00 |    5 |
|        0 | 4/03/2021 20:00 |    5 |
|        1 | 4/03/2021 7:00  |    5 |
|        1 | 4/03/2021 8:00  |    5 |
|        1 | 4/03/2021 9:00  |   10 |
|        1 | 4/03/2021 10:00 |   15 |
|        1 | 4/03/2021 12:00 |   15 |
|        1 | 4/03/2021 14:00 |   10 |
|        1 | 5/03/2021 15:00 |   30 |
|        1 | 5/03/2021 17:00 |   30 |
|        1 | 5/03/2021 18:00 |   20 |
|        1 | 5/03/2021 20:00 |   15 |
|        1 | 5/03/2021 21:00 |    5 |
|        1 | 5/03/2021 23:00 |    5 |
+----------+-----------------+------+

样本输出

Name: df2
+----------+-----------+-------+
| Location |   Date    | Count |
+----------+-----------+-------+
|        0 | 3/03/2021 |     2 |
|        0 | 4/03/2021 |     1 |
|        1 | 4/03/2021 |     0 |
|        1 | 5/03/2021 |     3 |
+----------+-----------+-------+

想法:如果我使用 .loc() ,我可能会丢失那些温度不超过 20 的位置。

如果我使用 .resample() 我不相信我可以设置 Temps 高于 20 的阈值,但我可以使用 Location 列按天重新采样。

目前我正在使用它,但结果出现问题,出现异常计数。

import pandas as pd

df1 = pd.read_csv(r'c:\Temp\GistExample.csv') #My dataframe is constructed differently. This may need to be cast to DateTime

#Find number of hours per day above 20
df2 = df1[['Location', 'DateTime', 'Temp']].copy()
df2['Date'] = pd.to_datetime(df2['DateTime']).dt.date
df2['IsItAbove20'] = 0
df2.loc[(df2['Temp'] >= 20), 'IsItabove20'] = 1

TimeAbove = df2.groupby(['Location', 'Date'])['Temp'].sum().reset_index()

标签: pythonpandasdataframe

解决方案


推荐阅读