【问题标题】:pandas : Substract each row from previous, and group result by maxpandas :从前一行中减去每一行,并将结果按最大值分组
【发布时间】:2020-10-09 21:33:55
【问题描述】:

我会尽力解释,对于每个用户,我有 2 个 counterq 每 15 分钟递增一次(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

提前致谢

【问题讨论】:

  • 这个问题有点含糊。您想要每个用户的 delta1 和 delta2 之间的最大记录吗?在您的示例中,您错过了列 delta2

标签: python-3.x pandas anaconda


【解决方案1】:

我试图找出你需要什么。希望答案是您所需要的:

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'
    )
)

【讨论】:

  • 谢谢,但它没有用,我希望每个用户只输出一行,首先计算增量(从以前的值中减去),而不是为每个增量做最大值
  • 它为每个用户的每个增量返回最大值。您有 2 个增量,因此每个用户最多有 2 个,这意味着 4 条记录。就像您在 Excel 中突出显示的记录一样。我错了吗?
  • 在我的 excel 中,我有两个用户,我计算了 delta1 和 delta2,当我按 delta1 和 delta 2 的最大值分组时,我将有一个 delta1 值(最大值)和一个 delta2 最大值,所以它会由用户给出一行....然后我将尝试通过尝试加入原始数据框来添加这个最大值的时间集合
  • 我根据您的需要修复了解决方案。如果还不够,请告诉我
  • 谢谢,它不起作用,它给了我一个新的全行 df,我需要一个只有 2 行的输出,每个用户一行..我不明白你的所有代码,但我看不到你什么时候在 diff 之后按 max 分组...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2019-06-13
  • 1970-01-01
  • 2021-01-23
相关资源
最近更新 更多