Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中对groupby应用lambda后获取第n行_Python_Pandas_Pandas Groupby - Fatal编程技术网

在python中对groupby应用lambda后获取第n行

在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 -

所以我需要根据数据帧的SessionId对其进行分组,然后我需要根据创建的时间对每个组进行排序,然后我只需要检索每个组的第n行

但是我发现在应用lambda之后,它变成了一个数据帧,而不是一个groupby对象,因此我不能使用.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)