在pd.DateFrame中查找每5行的最大值

时间:2017-09-20 21:46:50

标签: python pandas

我有一些间隔1分钟的营销数据。 作为csv-table的示例,每行代表每分钟的最大值:

time    ch1     ch2 ch3 ch4      
20:03   1754    539 149 1337     
20:04   2073    576 160 1448     
20:05   2246    599 176 1515     
20:06   2246    637 176 1531     
20:07   2457    651 183 1549     
20:08   2564    677 184 1655     
20:09   2624    712 191 1699     
20:10   2742    717 194 1672     
20:11   2788    714 199 1675     
20:12   2792    693 186 1680     
20:13   2914    708 188 1672     
20:14   3067    715 194 1685     
20:15   3067    725 196 1682     

另外,我需要找到每5分钟的最大值。因此,我需要找到每列5行(或更少 - 如果没有剩余行数)的最大值,并将其插入新的5分钟行。

我希望收到的信息(例如):

每个新行必须代表5的最大值

time    ch1     ch2 ch3 ch4     
20:03   2564    677 184 1655     
20:08   2914    717 199 1699     
20:13   3067    725 196 1685     

老实说,我已经搜索过但没有结果。

Python中是否有适合我任务的优雅解决方案? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

g = df.groupby(np.arange(len(df)) // 5)
g.max().assign(time=g.time.first())

    time   ch1  ch2  ch3   ch4   ch5
0  20:03  2457  651  183  1549  4840
1  20:08  2792  717  199  1699  5376
2  20:13  3067  725  196  1685  5670

答案 1 :(得分:4)

使用您的输入:

df['group']=df.index//5
target=df.groupby('group').agg(max)
target['time']=df.groupby('group').time.agg(min)

Out[511]: 
        time   ch1  ch2  ch3   ch4   ch5
group                                   
0      20:03  2457  651  183  1549  4840
1      20:08  2792  717  199  1699  5376
2      20:13  3067  725  196  1685  5670

答案 2 :(得分:3)

我将假设你没有将你的值转换为datetime,因为你指定这是一个csv数据表,所以我将索引转换为datetime

df.index = pd.to_datetime(df.time,format='%H:%M')

既然索引是datetime格式,我们可以使用resample按5分钟的间隔进行分组。注意:我将这里的基数设置为3,因为这是你想要格式化的方式,但是我认为从长远来看你可能更适合将它保留为0.所以要对数据进行分组运行

df.resample('5T',base=3).max().drop('time',1)

要将基数动态设置为第一分钟值,请使用

df.resample('5T',base=int(df.time.values[0][-1:])).max().drop('time',1)

收益率

                      ch1  ch2  ch3   ch4
time
2017-09-20 20:03:00  2457  651  183  1549
2017-09-20 20:08:00  2792  717  199  1699
2017-09-20 20:13:00  3067  725  196  1685

如果您不想在索引中运行日期

df.index = df.index.time

但是,您需要包含重新取样的日期

           ch1  ch2  ch3   ch4
20:03:00  2457  651  183  1549
20:08:00  2792  717  199  1699
20:13:00  3067  725  196  1685