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'
)
)
我会尽力解释,对于每个用户,我每 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'
)
)