Pandas结合loc和groupby后多维key错误

Pandas multidimensional key error after combining loc and groupby

我有 11 年来一年中每一天的每小时数据。我想每天找到最大臭氧值(我有 6 个臭氧柱),但我想保留最大值出现的小时标记的整行数据,包括日期。我在此数据框中存储了很多气象参数(如温度、风速等),并且不希望代码删除任何其他列。我希望代码向我显示出现最大臭氧值的行的每个细节,包括 datetime 列。 此代码的重要组成部分是我需要任何给定日期的最大臭氧值,同时保留所有其他数据行,包括日期时间列,这意味着我想查看年-月-日-时出现最大臭氧值。

这是我的 csv 文件的 link:https://drive.google.com/file/d/1iyrvbD9gPHoTmwhSxo8aPfgfAIbpOBK6/view?usp=sharing

这是我迄今为止尝试过的代码:

import pandas as pd

df = pd.read_csv('')
df.set_index('date', inplace=True)
df.index = pd.to_datetime(df.index)

#these are the columns I want to perform the action on:
ozone = ['MDA8_3135', 'MDA8_2551', 'MDA8_3186', 'MDA8_2878', 'MDA8_2199', 'MDA8_3168'] 

mda8 = df.loc[df.groupby([df.index.year, df.index.month, df.index.day], as_index=False)[ozone].idxmax()]

我也试过:

df['day'] = df.index.day
df['year'] = df.index.year
df['month'] = df.index.month
df = df.reset_index()
mda8 = df.loc[df.groupby(['year', 'month', 'day'], as_index=False)[ozone].idxmax()]

我也尝试了一个单独的专栏:

mda8 = df.loc[df.groupby(['year', 'month', 'day'], as_index=False)["MDA8_3135"].max()]

无论我使用什么方法,我都不断收到一条错误消息 ValueError: Cannot index with multidimensional key。我假设这是因为 groupby,但之前有人做过并让它工作: Get the row(s) which have the max value in groups using groupby

编辑

数据样本:

df = pd.DataFrame({'date':['2009-01-01 00:00:00', 
'2009-01-01 01:00:00', 
'2009-01-01 02:00:00', 
'2009-01-01 03:00:00', 
'2009-01-02 04:00:00', 
'2009-01-02 05:00:00', 
'2009-01-02 06:00:00', 
'2009-01-02 07:00:00', 
'2009-01-03 08:00:00', 
'2009-01-03 09:00:00'], 
'nox_3135(ppb)':[20,29,27,31,33,14,34,23,32,31],
'CO_3135(ppm)':[0.8,0.9,0.1,0.2,0.5,0.5,0.7,0.9,0.9,0.3],
'MDA8_3135':[42,45,47,51,52,52,57,67,65,70],
'pm25_3135_2018':[6,7,6,7,4,5,2,11,9,18]})

好的,请注意同一天有多个时间。我想从 MDA8_3135 列中提取每日最大臭氧值,并且我想包括该特定最大值中的 所有 其他行。 新的数据框看起来像:

new = pd.DataFrame({'date':['2009-01-01 03:00:00','2009-01-02 07:00:00', 
'2009-01-03 09:00:00'], 
'nox_3135(ppb)':[31,23,31],
'CO_3135(ppm)':[0.2,0.9,0.3],
'MDA8_3135':[51,67,70],
'pm25_3135_2018':[7,11,18]})

在我的实际数据框中,我有 6 个 MDA8 列,所以我想对所有这些列执行代码 INDIVIDUALLY 并创建 6 个具有最大臭氧浓度和对应于给定日期出现最大臭氧值的特定时间戳的所有其他列。

根据您的说明,您需要 6 个单独的数据框,在理解中计算它们。

对于给定的臭氧柱,使用 groupby.idxmax to find the date index of the max ozone value. Since some dates are NaT, dropna before indexing the matching rows with loc:

ozone = ['MDA8_3135', 'MDA8_2551', 'MDA8_3186', 'MDA8_2878', 'MDA8_2199', 'MDA8_3168'] 
df = pd.read_csv('IV_hourly_dataframe_Clim_Anom.csv', parse_dates=['date'], index_col=['date'])
out = {col: df.loc[df[col].groupby(df.index.date).idxmax().dropna()] for col in ozone}

在 pandas 1.3.3 和 python 3.9.7 上使用 IV_hourly_dataframe_Clim_Anom.csv 的输出:

>>> out['MDA8_3135']
#                      T_3186  T_5408  ...  MDA8_3135  ...  CO_3135_da8_anom  CO_2199_da8_anom
# date
# 2009-01-01 11:00:00    16.0     NaN  ...    35.0000  ...          1.096090          0.004785
# 2009-01-02 12:00:00    18.0     NaN  ...    32.1250  ...          0.258590          0.117285
# ...                     ...     ...  ...        ...  ...               ...               ...
# 2019-12-31 12:00:00    20.3   18.35  ...    37.2000  ...         -0.616592         -0.079884
>>> out['MDA8_2551']
#                      T_3186  T_5408  ...  MDA8_2551  ...  CO_3135_da8_anom  CO_2199_da8_anom
# date
# 2009-01-01 12:00:00    17.0     NaN  ...    34.2500  ...          0.383590          0.042285
# 2009-01-02 12:00:00    18.0     NaN  ...    28.7500  ...          0.258590          0.117285
# ...                     ...     ...  ...        ...  ...               ...               ...
# 2019-12-31 12:00:00    20.3   18.35  ...    32.7875  ...         -0.616592         -0.079884

...

>>> out['MDA8_3168']
#                      T_3186  T_5408  ...  MDA8_3168  ...  CO_3135_da8_anom  CO_2199_da8_anom
# date
# 2009-01-01 12:00:00    17.0     NaN  ...  39.250000  ...          0.383590          0.042285
# 2009-01-02 14:00:00    19.0     NaN  ...  58.000000  ...          0.508590          0.117285
# ...                     ...     ...  ...        ...  ...               ...               ...
# 2019-12-31 11:00:00    19.6   16.83  ...  44.187500  ...         -0.620967         -0.084234