首页 > 解决方案 > 查找数据框中索引的最大值和最新值

问题描述

在下面的数据帧中,我想将u每个用户的最大值减去u对应行的最大值t。所以它应该像 21 (u-max) - 18 (u-value of t-max)。数据框按以下方式分组['user','t']

user  t      u
1     0.0    -1.14
      2.30   2.8
      2.37   9.20
      2.40   21
      2.45   18
2     ...    ...

如果t不是索引的一部分,我会使用类似df.groupby().agg({'u':'max'})and的东西df.groupby().agg({'t':'max'}),但既然不是,我不知道如何agg()使用t

(编辑) 我发现我可以df.reset_index(level=['t'], inplace=True)用来将 t 更改为一列,但现在我意识到如果我使用 df.groupby(['user']).agg({"t":'max'}),则相应的u值将丢失

目标是创建一个包含如下值的新数据框:

user    (U_max - U_tmax) 
1        3
2        ...      

标签: pythondataframeaggregate

解决方案


让我们首先使用以下代码重新创建一个类似于您的数据框:

import pandas as pd
import numpy as np

cols =  ['user', 't', 'u']
df  = pd.DataFrame(columns=cols)
size = 10

df['user'] = np.random.randint(1,3, size=size)
df['t'] = np.random.uniform(0.0,3.0, size=size)

df = df.groupby(['user','t']).sum()
df['u'] = np.random.randint(-30,30, size=len(df))

print(df)

输出类似于:

                u
user t           
1    0.545562  19
     0.627296  23
     0.945533 -13
     1.697278 -18
     1.904453 -10
     2.008375   5
     2.296342  -2
2    0.282291  14
     1.461548  -6
     2.594966 -19

为了处理这个df,我们需要做的第一件事是重置索引,所以:

df = df.reset_index()

现在我们有所有的列,我们可以使用它们来应用我们的最终groupby()功能。

我们可以从分组开始user,这是我们需要的,将u和指定t为列,以便我们可以在 lambda 函数中访问它们。

在这个 lambda 函数中,我们将从 的max值中减去 的值u和对应umaxt

因此, 的最大值u必须类似于:

x['u'].max()

u值应该如下所示maxt

x['u'][x['t'].idxmax()]) 

如您所见,我们找到了 的最大值的索引t,并将其用于切片x['u']

这是最终代码

df = df.reset_index()

df = df.groupby(['user'])['u', 't'].apply(lambda x: (x['u'].max() - x['u'][x['t'].idxmax()]) )

print(df)

最终输出:

user
1    25
2    33

总错误检查:

  • maxu23user 1 _
  • maxtforuser 12.296342,对应u的是-2

23 - (-2)= 25

  • max14u _ user 2_
  • maxtforuser 22.594966,对应u的是-19

14 - (-19)= 33

额外提示:如果您想从 重命名返回的列,请在 groupby 操作之后groupby使用reset_index()with :set_index()

df = df.reset_index(name='(U_max - U_tmax)').set_index('user')

它将产生:

      (U_max - U_tmax)
user                  
1                   25
2                   33

推荐阅读