在python中对groupby应用lambda后得到第n行

时间:2018-04-06 04:16:13

标签: python pandas pandas-groupby

所以我需要通过SessionId对数据帧进行分组,然后我需要用创建的时间对每个组进行排序,之后我需要检索每个组的第n行。

但是我发现在应用lambda之后它变成了一个数据帧而不是一个逐个对象,因此我不能使用.nth属性

grouped = df.groupby(['SessionId'])

sorted = grouped.apply(lambda x: x.sort_values(["Created"], ascending = True))

sorted.nth  ---> error  

2 个答案:

答案 0 :(得分:3)

在这种情况下,更改接近问题的顺序会有所帮助。如果您先排序然后使用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是您的会话ID并且var1是时间戳,则会按id然后var1对您的数据框进行排序。然后从这些已排序的组中选取n行。 reset_index()只是为了避免产生多索引。

如果您想获取每个组的最后n行,可以使用.tail(n)代替.nth(n)

答案 1 :(得分:1)

我创建了一个小数据集 -

enter image description here

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)

这将返回 -

enter image description here

请注意,在python索引从零开始,因此对于n = 2,它将为您提供排序数据中的第3行