Python 查找数据帧中索引的最大值和最新值

Python 查找数据帧中索引的最大值和最新值,python,dataframe,aggregate,Python,Dataframe,Aggregate,在下面的数据frama中,我想用t的最大值对应行,将每个用户的u的最大值减去u的值。所以它应该是21(u-max)-18(t-max的u值)。 数据帧按['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':'m

在下面的数据frama中,我想用
t
的最大值对应行,将每个用户的
u
的最大值减去
u
的值。所以它应该是21(u-max)-18(t-max的u值)。 数据帧按
['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'})
df.groupby().agg({'t':'max'})
,但既然不是,我不知道如何在
t
上使用
agg()

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

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

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

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

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
x['u'].max()
为了处理此df,我们需要做的第一件事是重置索引,因此:

df = df.reset_index()
现在我们已经返回了所有列,可以使用它们应用最终的
groupby()
函数

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

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

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

                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
x['u'].max()
t
u
max
值应该如下所示:

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
严重错误检查:

user
1    25
2    33
  • user 1
    u
    max
    23
  • user 1
    t
    max
    2.296342
    ,相应的
    u
    -2
23-(-2)
=25

  • user 2
    u
    max
    14
  • user 2
    t
    max
    2.594966
    ,相应的
    u
    -19
14-(-19)
=33

额外提示:如果要重命名从
groupby
返回的列,请在groupby操作后使用
reset\u index()
以及
set\u index()

df = df.reset_index(name='(U_max - U_tmax)').set_index('user')
它将产生:

      (U_max - U_tmax)
user                  
1                   25
2                   33

您能添加所需输出的视觉表示吗?我已经添加了一些额外的信息。我希望输出应该是什么更容易理解一点