python - 条件均值
问题描述
我正在尝试计算一些最初以小时为单位的数据的每日平均值,它看起来像这样:
Date pm25 Quality_pm25
576 2020-02-25 00:00:00 22.0 1.00
577 2020-02-25 01:00:00 21.0 1.00
578 2020-02-25 02:00:00 27.0 1.00
579 2020-02-25 03:00:00 24.0 1.00
580 2020-02-25 04:00:00 27.0 1.00
581 2020-02-25 05:00:00 27.0 1.00
582 2020-02-25 06:00:00 27.0 1.00
583 2020-02-25 07:00:00 37.0 1.00
584 2020-02-25 08:00:00 41.0 1.00
585 2020-02-25 09:00:00 -9999.0 4.31
586 2020-02-25 10:00:00 -9999.0 4.31
587 2020-02-25 11:00:00 -9999.0 4.31
588 2020-02-25 12:00:00 -9999.0 4.31
589 2020-02-25 13:00:00 -9999.0 4.31
590 2020-02-25 14:00:00 -9999.0 4.31
591 2020-02-25 15:00:00 -9999.0 4.31
592 2020-02-25 16:00:00 -9999.0 4.31
593 2020-02-25 17:00:00 -9999.0 4.31
594 2020-02-25 18:00:00 -9999.0 4.31
595 2020-02-25 19:00:00 -9999.0 4.31
596 2020-02-25 20:00:00 -9999.0 4.31
597 2020-02-25 21:00:00 -9999.0 4.31
598 2020-02-25 22:00:00 -9999.0 4.31
599 2020-02-25 23:00:00 -9999.0 4.31
我一直在使用这段代码,它工作正常。
import numpy as np
import pandas as pd
df = pd.read_csv('Data/estacion_data_calidadaire_25_20200201_20200229.csv',
parse_dates=['Date'])
df = df[['Date', 'pm25', 'Quality_pm25']]
invalid = ((df['Quality_pm25'] >=2.6) | (df['pm25'] == -9999))
valid = (df[~invalid])
mean = valid.groupby(valid['Date'].dt.day)['pm25'].mean()
mean = round(mean, 0)
这导致:
Date
1 22.0
2 14.0
3 15.0
4 21.0
5 24.0
6 29.0
7 37.0
8 34.0
9 28.0
10 29.0
11 30.0
12 32.0
13 33.0
14 40.0
15 25.0
16 19.0
17 20.0
18 21.0
19 28.0
20 28.0
21 29.0
22 23.0
23 21.0
24 27.0
25 28.0
现在,我想设置一个条件来计算该平均值,如果在应用以下确定哪些数据无效的过滤器之后数据小时数小于 18:
invalid = ((df['Quality_pm25'] >=2.6) | (df['pm25'] == -9999))
例如,如果我要计算 2020 年 2 月 25 日的平均值(数据显示在开头),因为 24 小时中只有 9 小时有有效数据(如下所示),我希望平均值为 NaN .
Date pm25 Quality_pm25
576 2020-02-25 00:00:00 22.0 1.00
577 2020-02-25 01:00:00 21.0 1.00
578 2020-02-25 02:00:00 27.0 1.00
579 2020-02-25 03:00:00 24.0 1.00
580 2020-02-25 04:00:00 27.0 1.00
581 2020-02-25 05:00:00 27.0 1.00
582 2020-02-25 06:00:00 27.0 1.00
583 2020-02-25 07:00:00 37.0 1.00
584 2020-02-25 08:00:00 41.0 1.00
期望结果
Date
25 NaN
我怎样才能做到这一点?我希望很清楚我想要做什么。
解决方案
我找到了解决我的问题的方法,如下所示:
mean = valid.groupby(valid['Date'].dt.day)['pm25_' + i].mean().where(valid.groupby(valid['Dia'].dt.day)['pm25_' + i].count().ge(18))
但是现在当平均值完成时,有一些值没有出现我试图使用.mean(skipna = False)
但它显示一个错误:
TypeError: mean() got an unexpected keyword argument 'skipna'
我查了一下,.mean()
确实有一个skipna=None
关键字,我不知道出了什么问题。
推荐阅读
- php - PHP MVC Count 函数并传递给视图
- mysql - 如何在列表值选择集合中使用mysql查找
- algorithm - 计算给定异或范围(0-k)的所有对
- javascript - 在 div 元素内单击时,自定义下拉菜单会关闭,为什么?
- arrays - 如何减少代码重复(帕斯卡)
- c++ - 如何解决错误“候选模板被忽略:无法推断模板参数'T'”?
- php - aws php刷新令牌,没有返回刷新令牌
- tensorflow - 从 LSTM 模型中获取预测值
- unity3d - Google play 排行榜玩家资料未公开 Unity
- inheritance - 在运行时使用超类中的子类,无需循环导入 ES6