pandas :从前一行中减去每一行,并将结果按最大值分组

pandas : Substract each row from previous, and group result by max

我会尽力解释,对于每个用户,我每 15 分钟增加 2 个计数器(Traf1 和 Traf2,我每天计算 96 个值),我需要每 15 分钟计算 2 个新值通过从以前的值(15 分钟前)中减去每个用户并计算每个用户的最大值,最后加入这个最大值的确切时间集合(我的 excel 文件更清楚)。

ID  date_collection time_collect_traf1  traf1   time_collect_traf2  traf2
USER1   06/10/2020  06/10/2020 00:02    42722552446 06/10/2020 00:02    48354907401
USER1   06/10/2020  06/10/2020 00:17    42723408951 06/10/2020 00:17    48355583235
USER1   06/10/2020  06/10/2020 00:32    42724472767 06/10/2020 00:32    48356231232
USER1   06/10/2020  06/10/2020 00:47    42725824692 06/10/2020 00:47    48356923086
USER1   06/10/2020  06/10/2020 01:02    42726780008 06/10/2020 01:02    48357843935
USER1   06/10/2020  06/10/2020 01:17    42727942297 06/10/2020 01:17    48358668348
USER1   06/10/2020  06/10/2020 01:32    42728814704 06/10/2020 01:32    48359370387
USER1   06/10/2020  06/10/2020 01:47    42729720388 06/10/2020 01:47    48360064369
USER1   06/10/2020  06/10/2020 02:03    42730648238 06/10/2020 02:03    48360775116
USER1   06/10/2020  06/10/2020 02:17    42732118437 06/10/2020 02:17    48361489390
USER1   06/10/2020  06/10/2020 02:32    42735743381 06/10/2020 02:32    48362475815

来自文件的示例:Excel file

计算方法:

1-对于列 traf1、traf2,对于每个用户,我需要根据 time_collection

从先前的值中减去每个值

2-计算出增量后,我必须按最大值分组,并且对于每个分组,当我达到最大值时我需要 time_collection。

例如,在我的 excel 文件中我计算了 Delta1 和 Delta2,我需要的最大值是黄色的,这个最大值的时间也是。

我从 excel 文件中输出的内容一定是这样的:

ID  date_collection time_collect_traf1  time_collect_traf2  Max_Delta_Traf1 Max_Delta_traf2
USER1   06/10/2020  06/10/2020 22:02    126733343   06/10/2020 10:32    5442197
USER2   06/10/2020  06/10/2020 13:17    1917627204  06/10/2020 15:17    84254498

提前致谢

我试图找出你需要的东西。希望答案是你需要的:

df =pd.read_excel('USERS_FILE.xlsx')
df=(
    df
    .assign(diff1 = lambda x: x[['ID','date_collection','traf1']].groupby(['ID','date_collection']).diff())
    .assign(diff2 = lambda x: x[['ID','date_collection','traf2']].groupby(['ID','date_collection']).diff())
)
print(
    df[['ID','time_collect_traf1','diff1']]
    .sort_values('diff1',ascending=False)
    .groupby(['ID'])
    .head(1)
    .merge(
        (
            df[['ID','time_collect_traf2','diff2']]
            .sort_values('diff2',ascending=False)
            .groupby(['ID'])
            .head(1)),
        on='ID',
        how='left'
    )
)