Pandas在groupby之后得到行

时间:2017-04-17 09:37:32

标签: python pandas dataframe group-by

假设我有以下数据集:

uid iid val
 1   1   2
 1   2   3
 1   3   4
 1   4  4.5
 1   5  5.5
 2   1   3
 2   2   3
 2   3   4
 3   4  4.5
 3   5  5.5

根据这些数据,我想首先使用uid进行分组,然后从每个uid获取最后20%的行数。

也就是说,因为uid = 1有5行,我想从uid = 1获得最后1行(5的20%)。

以下是我想要做的事情:

df.groupby('uid').tail([20% of each uid])

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试将自定义函数应用于groupby对象。在函数内部计算应该采取的行数,并使用该行数获取组tailint向0舍入,因此任何行数少于5的组都不会向结果提供任何行。

df.groupby('uid').apply(lambda x: x.tail(int(0.2*x.shape[0])))

答案 1 :(得分:1)

我使用分区

df.groupby('uid').apply(lambda x: x.tail(len(x) // 5))

       uid  iid  val
uid                 
1   4    1    5  5.5

通过将uid传递给group_keys=False

,您可以避免首先在索引中加入groupby
df.groupby('uid', group_keys=False).apply(lambda x: x.tail(len(x) // 5))

   uid  iid  val
4    1    5  5.5