这是后续pandas groupby:每组的前 3 个值 https://stackoverflow.com/questions/47703606/pandas-groupby-top-3-values-for-each-group/47703756#47703756如果每组中的行数至少为 3,则此处描述的解决方案是完美的,但如果至少其中一个组不够大,则该解决方案将失败。
我在这里提出一个需要另一种解决方案的新数据集。
有些数据是随机保存的,我需要找到每小时最高的 3 个值:
VAL
TIME
2017-12-08 00:55:00 29
2017-12-08 01:10:00 56
2017-12-08 01:25:00 82
2017-12-08 01:40:00 13
2017-12-08 01:55:00 35
2017-12-08 02:10:00 53
2017-12-08 02:25:00 25
2017-12-08 02:40:00 23
2017-12-08 02:55:00 21
2017-12-08 03:10:00 12
2017-12-08 03:25:00 15
它应该返回这个 DataFrame,没有检测到最大值的时间:
VAL1 VAL2 VAL3
TIME
2017-12-08 00:00:00 29 None None
2017-12-08 01:00:00 82 56 35
2017-12-08 02:00:00 53 25 23
2017-12-08 03:00:00 15 12 None
None
位于可用行数少于 3 行的组中。
生成数据集的代码是:
from datetime import *
import pandas as pd
import numpy as np
df = pd.DataFrame()
date_ref = datetime(2017,12,8,0,55,0)
days = pd.date_range(date_ref, date_ref + timedelta(0.11), freq='15min')
np.random.seed(seed=1111)
data1 = np.random.randint(1, high=100, size=len(days))
df = pd.DataFrame({'TIME': days, 'VAL': data1})
df = df.set_index('TIME')
# groupby
group1 = df.groupby(pd.Grouper(freq='1H'))
largest3 = pd.DataFrame(group1["VAL"].nlargest(3))
我的问题是如何将这些值保存到一个新的 DataFrame 中,也许可以从largest3
:
VAL
TIME TIME
2017-12-08 00:00:00 2017-12-08 00:55:00 29
2017-12-08 01:00:00 2017-12-08 01:25:00 82
2017-12-08 01:10:00 56
2017-12-08 01:55:00 35
2017-12-08 02:00:00 2017-12-08 02:10:00 53
2017-12-08 02:25:00 25
2017-12-08 02:40:00 23
2017-12-08 03:00:00 2017-12-08 03:25:00 15
2017-12-08 03:10:00 12
编辑:添加了reset_index
largest3 = pd.DataFrame(group1["VAL"].nlargest(3)).reset_index(level=1, drop=True)
返回更好的概述,但我不知道如何从这里继续:
VAL
TIME
2017-12-08 00:00:00 29
2017-12-08 01:00:00 82
2017-12-08 01:00:00 56
2017-12-08 01:00:00 35
2017-12-08 02:00:00 53
2017-12-08 02:00:00 25
2017-12-08 02:00:00 23
2017-12-08 03:00:00 15
2017-12-08 03:00:00 12