如何计算熊猫每列的每日平均值?
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
列。然后,对year
和day
部分进行分组,忽略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 小时时丢弃? @krm76dt.days
根本不关心时间。它只会选择日期列中提到的所有日期。
您提出的解决方案与我一开始使用的解决方案没有任何区别。尽管如此,我还是投票赞成你的答案。但我不能认为它是唯一的答案。以上是关于如何计算熊猫每列的每日平均值?的主要内容,如果未能解决你的问题,请参考以下文章