Python 前Y天的前X个值的数据框-分组依据

Python 前Y天的前X个值的数据框-分组依据,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有三个变量的数据,我想找到一个变量每天的最大X值。以前我编写了一些代码来查找一天中最大值出现的小时数,但现在我想添加一些选项来查找更多的每天最大小时数 我一直都能找到每天最大的X值,但我一直坚持把它缩小到从前X天开始的最大X值。我已经包括了详细说明最终结果的图片 数据 确定的前2小时 代码 df = pd.DataFrame( {'ID':['ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1

我有三个变量的数据,我想找到一个变量每天的最大X值。以前我编写了一些代码来查找一天中最大值出现的小时数,但现在我想添加一些选项来查找更多的每天最大小时数

我一直都能找到每天最大的X值,但我一直坚持把它缩小到从前X天开始的最大X值。我已经包括了详细说明最终结果的图片

数据

确定的前2小时

代码

df = pd.DataFrame(
{'ID':['ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1','ID_1'],
'Year':[2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018,2018],
'Month':[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6],
'Day':[12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17],
'Hour':[19,20,21,22,11,12,13,19,19,20,21,22,18,19,20,21,19,20,21,23,19,20,21,22],
'var_1': [0.83,0.97,0.69,0.73,0.66,0.68,0.78,0.82,1.05,1.05,1.08,0.88,0.96,0.81,0.71,0.88,1.08,1.02,0.88,0.79,0.91,0.91,0.80,0.96],
'var_2': [47.90,42.85,67.37,57.18,66.13,59.96,52.63,54.75,32.54,36.58,36.99,37.23,46.94,52.80,68.79,50.84,37.79,43.54,48.04,38.01,42.22,47.13,50.96,44.19],
'var_3': [99.02,98.10,98.99,99.12,98.78,98.90,99.09,99.20,99.22,99.11,99.18,99.24,99.00,98.90,98.87,99.07,99.06,98.86,98.92,99.32,98.93,98.97,98.99,99.21],})

# Get the top 2 var2 values each day
top_two_var2_each_day = df.groupby(['ID', 'Year', 'Month',  'Day'])['var_2'].nlargest(2)
top_two_var2_each_day = top_two_var2_each_day.reset_index()

# set level_4 index to the current index
top_two_var2_each_day = top_two_var2_each_day.set_index('level_4')

# use the index from the top_two_var2 to get the rows from df to get values of the other variables when top 2 values occured
top_2_all_vars = df[df.index.isin(top_two_var2_each_day.index)]
最终目标结果

我认为最好的方法是平均这两个小时,以确定哪几天的平均值最大,然后返回top_2_all_vars数据框并获取发生这些天的行。我不知道如何进行

mean_day = top_2_all_vars.groupby(['ID', 'Year', 'Month',  'Day'],as_index=False)['var_2'].mean()
top_2_day = mean_day.nlargest(2, 'var_2')

最终数据帧

这就是我试图找到的结果。一个数据帧,由前2天中的每一天的var_2的前2个值组成

我以前使用的代码用于查找每天的单个最大值,但我不知道如何使其工作超过单个最大值

使用Groupbys可能不是最好的方法,但我对任何事情都持开放态度

这是一种方法:

如果您的数据跨越多个月,那么当月份和日期位于不同的列中时,处理数据会困难得多。因此,首先我制作了一个名为“Date”的新专栏,它将月份和日期结合起来

df['Date'] = df['Month'].astype('str')+"-"+df['Day'].astype('str')
接下来,我们需要每天var_2的前两个值,然后求它们的平均值。所以我们可以创建一个非常简单的函数来精确地找到它

def topTwoMean(series):
    top = series.sort_values(ascending = False).iloc[0]
    second = series.sort_values(ascending = False).iloc[1]
    return (top+second)/2   
然后我们使用我们的函数,按var_2的平均值排序,得到最高的2天,然后将日期保存到列表中

maxDates = df.groupby('Date').agg({'var_2': [topTwoMean]})\
             .sort_values(by = ('var_2', 'topTwoMean'), ascending = False)\
             .reset_index()['Date']\
             .head(2)\
             .to_list()
最后,我们根据上面选择的日期进行筛选,然后找到这两天Var2的最高值

df[df['Date'].isin(maxDates)]\
             .groupby('Date')\
             .apply(lambda x: x.sort_values('var_2', ascending = False).head(2))\
             .reset_index(drop = True)


        ID  Year    Month   Day Hour    var_1   var_2   var_3   Date

0      ID_1 2018     6      12   21     0.69    67.37   98.99   6-12
1      ID_1 2018     6      12   22     0.73    57.18   99.12   6-12
2      ID_1 2018     6      13   11     0.66    66.13   98.78   6-13
3      ID_1 2018     6      13   12     0.68    59.96   98.90   6-13

老实说,我真的很困惑你到底在找什么。这只是每天3个变量的最大值吗??如果是这样的话,
df.groupby(['Month','Day']).agg({'var_1':'max','var_2':'max','var_3':'max'})将起作用。@BenPap基本上有三个步骤。1.)找到每天var_2的前2个值。2.)根据步骤#1的var#2平均值找出前2天。3.)从df创建一个新的数据框,显示前两天的前两个小时。您的数据是否仅在6月份?或者它也跨越多个月?有时会是多个月,但这次只是六月。
df[df['Date'].isin(maxDates)]\
             .groupby('Date')\
             .apply(lambda x: x.sort_values('var_2', ascending = False).head(2))\
             .reset_index(drop = True)


        ID  Year    Month   Day Hour    var_1   var_2   var_3   Date

0      ID_1 2018     6      12   21     0.69    67.37   98.99   6-12
1      ID_1 2018     6      12   22     0.73    57.18   99.12   6-12
2      ID_1 2018     6      13   11     0.66    66.13   98.78   6-13
3      ID_1 2018     6      13   12     0.68    59.96   98.90   6-13