按年份查找最大值并返回在 Pandas 中出现最大值的日期,日期为索引

Posted

技术标签:

【中文标题】按年份查找最大值并返回在 Pandas 中出现最大值的日期,日期为索引【英文标题】:Find max by year and return date on which max occurred in Pandas with dates as index 【发布时间】:2022-01-03 00:09:03 【问题描述】:

我有这个数据框

date,AA
1980-01-01, 77.7
1980-01-02, 86
1980-01-03, 92.3
1980-01-04, 96.4
1980-01-05, 85.7
1980-01-06, 75.7
1980-01-07, 86.8
1980-01-08, 93.2
1985-08-13, 224.6
1985-08-14, 213.9
1985-08-15, 205.7
1985-08-16, 207.3
1985-08-17, 202.1

我想计算每年的最大值和发生日期。我正在苦苦挣扎,因为我确实想将日期保留为索引。

我确实是这样读的:

dfr    = pd.read_csv(fnamed, sep=',', header = 0, index_col=0, parse_dates=True)

我知道我可以重新采样为

dfr_D = dfr.resample('Y').max()

但在这种情况下,我会丢失有关年内最大值位置的信息。

我找到了这个:

idx = dfr.groupby(lambda x: dfr['date'][x].year)["A"].idxmax()

但是,dfr['date'] 似乎是列的名称,而在我的情况下,索引中的日期和 '.year' 不是它的属性之一。

我觉得我应该使用“groupby”和“indexmax”。但是,我参加的所有活动都失败了。

提前致谢

【问题讨论】:

【参考方案1】:

假设“日期”是日期时间类型和一列,您可以使用以下内容将数据切片为每组的最大值:

df.loc[df.groupby(df['date'].dt.year)['AA'].idxmax().values]

输出:

        date     AA
3 1980-01-04   96.4
8 1985-08-13  224.6

如果“日期”是索引:

df.loc[df.groupby(df.index.year)['AA'].idxmax().values]

输出:

               AA
date             
1980-01-04   96.4
1985-08-13  224.6

【讨论】:

完美。十分优雅。在我的真实情况下,我有两列'AA','BB'。这意味着我得到了另一个数据框作为你精彩命令的输出。如何只使用选定的列?

以上是关于按年份查找最大值并返回在 Pandas 中出现最大值的日期,日期为索引的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 查找列的最大值并返回相应的行值

在 Multiindex Pandas 系列中获取每个组中最大的

查找表中每个 ID 的最大连续年份(Oracle SQL)

Django - 按最大(日期)年份过滤查询集

查找最大值并按 id 为非数字字段按组分配值

MySQL按顺序查找每组最近/最大的记录