如何计算熊猫每列的每日平均值?

Posted

技术标签:

【中文标题】如何计算熊猫每列的每日平均值?【英文标题】:How to compute daily mean values for each column in pandas? 【发布时间】:2020-08-09 10:10:32 【问题描述】:

我有一个从 2001 年到 2018 年每小时读取某些污染物的数据框 (df)。df 包含以下信息:

    date                    O_3     NO_2        SO_2        PM10        PM25        CO      
0   2001-01-01 01:00:00     7.86    67.120003   26.459999   32.349998   12.505127   0.45    
1   2001-01-01 02:00:00     7.21    70.620003   20.879999   40.709999   12.505127   0.48    
2   2001-01-01 03:00:00     7.11    72.629997   21.580000   50.209999   12.505127   0.41    
3   2001-01-01 04:00:00     7.14    75.029999   19.270000   54.880001   12.505127   0.51    
4   2001-01-01 05:00:00     8.46    66.589996   13.640000   42.340000   12.505127   0.19    
5   2018-04-30 20:00:00     63.00   58.000000   4.000000    2.000000    2.000000    0.30    
6   2018-04-30 21:00:00     49.00   65.000000   4.000000    5.000000    4.000000    0.30    
7   2018-04-30 22:00:00     49.00   58.000000   4.000000    5.000000    3.000000    0.30    
8   2018-04-30 23:00:00     48.00   52.000000   4.000000    7.000000    7.000000    0.30    
9   2018-05-01 00:00:00     52.00   43.000000   4.000000    6.000000    4.000000    0.30    

我想根据天数计算每列的平均值。换句话说,对于 2001-01-01,计算 01 到 05 小时的平均值。上面的 df 只是一个小例子,实际的 df 主要每天运行 24 小时,尽管它们可能是每小时污染物较少的日子读数。一旦我计算出每一列的平均值,我就会计算每一行以获得一个标签。

df 具有以下规格:

Index(['date', 'O_3', 'NO_2', 'SO_2', 'PM10', 'PM25', 'CO', 'Label'], dtype='object')

就 NaN 值而言:

date     0
O_3      0
NO_2     0
SO_2     0
PM10     0
PM25     0
CO       0
Label    0
dtype: int64

至于一般信息:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 139608 entries, 0 to 139607
Data columns (total 8 columns):
#   Column  Non-Null Count   Dtype         
---  ------  --------------   -----         
0   date    139608 non-null  datetime64[ns]
1   O_3     139608 non-null  float64       
2   NO_2    139608 non-null  float64       
3   SO_2    139608 non-null  float64       
4   PM10    139608 non-null  float64       
5   PM25    139608 non-null  float64       
6   CO      139608 non-null  float64       
7   Label   139608 non-null  float64       
dtypes: datetime64[ns](1), float64(7)

为了按日期分组,我尝试了以下方法:

day_df = hour_df.groupby([hour_df.date.dt.strftime('%Y-%m-%d')]).mean()

但我不确定这是否是正确的方法。如果我检查我得到的 df 信息:

<class 'pandas.core.frame.DataFrame'>
Index: 5824 entries, 2001-01-01 to 2018-05-01
Data columns (total 7 columns):
#   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
0   O_3     5824 non-null   float64
1   NO_2    5824 non-null   float64
2   SO_2    5824 non-null   float64
3   PM10    5824 non-null   float64
4   PM25    5824 non-null   float64
5   CO      5824 non-null   float64
6   Label   5824 non-null   float64
dtypes: float64(7)

可以看出,并非所有日子都有 24 小时的污染物读数,否则将有 6329 个条目,而不是只有 5824 个条目。这就是为什么我不确定我是否正确计算了平均值。

我真的很想知道什么是定位我正在寻找的东西的正确方法。

【问题讨论】:

在哪里可以看到 6329 个条目?你的数字都是一致的。 从 2001-01-01 到 2018-05-01 共有 6329 天。您可以看到,对于每日 de,只有 5824 个条目可以转换为天。除非,正如我提到的,我做错了。 【参考方案1】:

date 列转换为pandas datetime 列。然后,对yearday 部分进行分组,忽略hour 部分以获得mean

In [663]: times = pd.to_datetime(df['date'])
In [662]: df.groupby([times.dt.year, times.dt.day]).mean()                                                                                                                                                                   
Out[662]: 
            O_3       NO_2       SO_2       PM10       PM25    CO
Date                                                             
1     14.963333  65.831666  17.638333  37.748333  11.087606  0.39
30    52.250000  58.250000   4.000000   4.750000   4.000000  0.30

【讨论】:

在用你的代码行实现它时,我得到的条目(天)越来越少,我实际上只得到了 558 个条目,我想知道为什么? .dt 是否每 24 小时计算天数并在无法计算 24 小时时丢弃? @krm76 dt.days 根本不关心时间。它只会选择日期列中提到的所有日期。 您提出的解决方案与我一开始使用的解决方案没有任何区别。尽管如此,我还是投票赞成你的答案。但我不能认为它是唯一的答案。

以上是关于如何计算熊猫每列的每日平均值?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫移动平均线[重复]

Python:如何获取按 id 分组的每列的 n 个最大值的平均值

计算循环中每列的中位数

如何计算配置单元中一条记录的大小?

熊猫在最高 x 列中的平均值

查找数据框中每列的平均值,按标签分组,不包括一个标签