Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pandas groupby:每组中的前3个值并存储在数据帧中_Python_Pandas - Fatal编程技术网

Python pandas groupby:每组中的前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-

这是一个后续行动 如果每个组中的行数至少为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
它应返回此数据帧,不包括检测到最大值的时间:

                     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
是最惯用的方式。。。