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

3

我有一些与市场营销相关的数据,时间间隔为1分钟。 作为csv表格的样本,每行代表每分钟的最大值:

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个回答

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

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

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

谢谢!但是在数据集中有几天(15.09、16.09、17.09)。你知道如何在日期框架中设置不同的日期吗?(因为它将是.xls格式,而不仅仅是.csv)。 - Hermess
你能否更新一下你的示例,包括日期吗?如果它只是一个日期列,你可以将该列合并并将其变成 datetime 对象。 - DJK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接