python - 最大月值,同时保留出现该值的数据
问题描述
我的每日降雨量数据如下所示:
Date Rainfall (mm)
1922-01-01 0.0
1922-01-02 0.0
1922-01-03 0.0
1922-01-04 0.0
1922-01-05 31.5
1922-01-06 0.0
1922-01-07 0.0
1922-01-08 0.0
1922-01-09 0.0
1922-01-10 0.0
1922-01-11 0.0
1922-01-12 9.1
1922-01-13 6.4
我正在尝试计算每年每个月的最大值,以及最大值出现的日期。我一直在使用代码:
rain_data.groupby(pd.Grouper(freq = 'M'))['Rainfall (mm)'].max()
这将返回正确的最大值,但返回每个月的结束日期,而不是最大事件发生的日期。
1974-11-30 0.0
我也尝试过使用 .idxmax(),但这也只是返回每个月的结束值。
关于如何获得正确日期的任何建议?
解决方案
pd.Grouper
似乎改变了组内的顺序 for ,这打破了+Datetime
的通常技巧。而是按年份和月份分组:.sort_values
.tail
df.sort_values('Rainfall (mm)').groupby([df.Date.dt.year, df.Date.dt.month]).tail(1)
样本数据 + 输出
import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({'Date': pd.date_range('1922-01-01', freq='D', periods=100),
'Rainfall (mm)': np.random.randint(1,100,100)})
df.sort_values('Rainfall (mm)').groupby([df.Date.dt.month, df.Date.dt.year]).tail(1)
# Date Rainfall (mm)
#82 1922-03-24 92
#35 1922-02-05 98
#2 1922-01-03 99
#90 1922-04-01 99
问题pd.Grouper
在于它创建了DatetimeIndex
一个月底频率,我们并不真正需要并且我们正在使用.apply
. 这为您提供了一个新索引,并且按日期很好地排序!
(df.groupby(pd.Grouper(key='Date', freq='1M'))
.apply(lambda x: x.loc[x['Rainfall (mm)'].idxmax()])
.reset_index(drop=True))
# Date Rainfall (mm)
#0 1922-01-03 99
#1 1922-02-05 98
#2 1922-03-24 92
#3 1922-04-01 99
也可以.drop_duplicates
使用日期的前 7 个字符来获取年月
(df.assign(ym = df.Date.astype(str).str[0:7])
.sort_values('Rainfall (mm)')
.drop_duplicates('ym', keep='last')
.drop(columns='ym'))
推荐阅读
- sql - 如何以正确的方式使用模型 - 用 typescript 续集
- javascript - 将搜索结果传递给反应中的另一个页面/组件
- reactjs - 尝试设置坐标时设置状态无法正常工作
- unity3d - Physics.OverlapBox 的错误使用
- pip - 使用 pip 安装 conda 失败
- swift - 使用 UIImagePickerController 更改自定义单元格的图像
- asp.net - ASPX Trace First(s) 和 Last(s) 是什么意思?
- azure-devops - Azure Devops 发布 - 发布了错误的 AppSettings.JSON
- android - 在android中使用改造的json解析错误
- python - 如何手动解密 StringEncryptedType - SQLAlchemy-utils?