在python中对groupby应用lambda后获取第n行
所以我需要根据数据帧的SessionId对其进行分组,然后我需要根据创建的时间对每个组进行排序,然后我只需要检索每个组的第n行 但是我发现在应用lambda之后,它变成了一个数据帧,而不是一个groupby对象,因此我不能使用.nth属性在python中对groupby应用lambda后获取第n行,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,所以我需要根据数据帧的SessionId对其进行分组,然后我需要根据创建的时间对每个组进行排序,然后我只需要检索每个组的第n行 但是我发现在应用lambda之后,它变成了一个数据帧,而不是一个groupby对象,因此我不能使用.nth属性 grouped = df.groupby(['SessionId']) sorted = grouped.apply(lambda x: x.sort_values(["Created"], ascending = True)) sorted.nth -
grouped = df.groupby(['SessionId'])
sorted = grouped.apply(lambda x: x.sort_values(["Created"], ascending = True))
sorted.nth ---> error
在这种情况下,更改处理问题的顺序会有所帮助。如果先进行排序,然后使用groupby,您将获得所需的输出,并且可以使用groupby.nth函数 下面是一段代码片段来演示这一想法:
df = pd.DataFrame({'id':['a','a','a','b','b','b'],
'var1':[3,2,1,8,7,6],
'var2':['g','h','i','j','k','l']})
n = 2 # replace with required row from each group
df.sort_values(['id','var1']).groupby('id').nth(n).reset_index()
假设id
是您的sessionid,var1
是时间戳,这将按照id
然后var1
对数据帧进行排序。然后从每个已排序的组中选取n
th行。这里的reset_index()
只是为了避免产生多索引
如果您想获得每组最后的
n
行,可以使用.tail(n)
而不是.nth(n)
我创建了一个小数据集-
这将返回-
请注意,在python索引中,从零开始,因此对于n=2,它将为您提供排序数据中的第三行谢谢,如果我设置n=9,那么少于9行的组会发生什么情况?在这种情况下,这些特定组在最终数据帧中不会有任何对应的行。因此,您将只看到组中有
n
行的行
n = 2
grouped = df.groupby('SessionId')
pd.concat([grouped.get_group(x).sort_values(by='SortVar').reset_index().loc[[n]] for x in grouped.groups]\
,axis=0)