假设我有以下数据集:
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])
任何人都可以帮助我吗?
答案 0 :(得分:2)
您可以尝试将自定义函数应用于groupby
对象。在函数内部计算应该采取的行数,并使用该行数获取组tail
。 int
向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