Pandas consiguen filas después de groupby

Supongamos que tengo el siguiente conjunto de datos:

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 

A partir de estos datos, quiero agrupar primero por uid, luego obtener el último 20% del número de filas de cada uid.

Es decir, como uid = 1 tiene 5 filas, quiero obtener la última 1 fila (20% de 5) de uid = 1.

Lo siguiente es lo que quiero hacer:

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

¿Alguien puede ayudarme?

Puede intentar aplicar una función personalizada a groupby objeto por grupo. Dentro de la función, calcule cuántas filas se deben tomar y tome la tail del grupo con ese número de filas. int redondea hacia 0, por lo que cualquier grupo con menos de 5 filas no aportará ninguna fila al resultado.

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

Yo uso división de piso

 df.groupby('uid').apply(lambda x: x.tail(len(x) // 5)) uid iid val uid 1 4 1 5 5.5 

Puede evitar incluir el uid en el índice en primer lugar al pasar group_keys=False al grupo groupby

 df.groupby('uid', group_keys=False).apply(lambda x: x.tail(len(x) // 5)) uid iid val 4 1 5 5.5