Python 查找数据帧中索引的最大值和最新值
在下面的数据frama中,我想用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
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
您能添加所需输出的视觉表示吗?我已经添加了一些额外的信息。我希望输出应该是什么更容易理解一点