首页 > 解决方案 > 条件均值

问题描述

我正在尝试计算一些最初以小时为单位的数据的每日平均值,它看起来像这样:

    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

我怎样才能做到这一点?我希望很清楚我想要做什么。

标签: pythonpandas

解决方案


我找到了解决我的问题的方法,如下所示:

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关键字,我不知道出了什么问题。


推荐阅读