Python pandas groupby:每组中的前3个值并存储在数据帧中
这是一个后续行动 如果每个组中的行数至少为3,那么这里描述的解决方案是完美的,但是如果至少有一个组不够大,那么它就失败了 我在这里提出了一个新的数据集,它需要另一个解决方案 有些数据是在随机时间保存的,我需要找到每小时最高的3个值:Python pandas groupby:每组中的前3个值并存储在数据帧中,python,pandas,Python,Pandas,这是一个后续行动 如果每个组中的行数至少为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-
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
它应返回此数据帧,不包括检测到最大值的时间:
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))
我的问题是如何将这些值保存到一个新的数据帧中,或者从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
编辑:添加重置索引
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
诀窍是创建一个不基于
set\u index
+模数的索引,cumcount
在组内提供一个累进计数器:
largest3 = (pd.DataFrame(group1["VAL"]
.nlargest(3))
.reset_index(level=1, drop=True))
largest3['index'] = largest3.groupby('TIME').cumcount() # temporary index
largest3 = (largest3.set_index("index", append=True)['VAL']
.unstack()
.add_prefix('VAL'))
根据要求,结果是:
index VAL0 VAL1 VAL2
TIME
2017-12-08 00:00:00 29.0 NaN NaN
2017-12-08 01:00:00 82.0 56.0 35.0
2017-12-08 02:00:00 53.0 25.0 23.0
2017-12-08 03:00:00 15.0 12.0 NaN
您可能需要重置索引并将其保存到新的数据帧中。yasin mohammad,请您告诉我如何执行此操作,也许可以用一个正确的答案,我可以向上投票?我在编辑问题时添加了您的提示。是的,我认为在这种情况下使用
cumcount
是最惯用的方式。。。