Manteniendo los últimos duplicados de N en pandas.

Dado un dataframe:

>>> import pandas as pd >>> lol = [['a', 1, 1], ['b', 1, 2], ['c', 1, 4], ['c', 2, 9], ['b', 2, 10], ['x', 2, 5], ['d', 2, 3], ['e', 3, 5], ['d', 2, 10], ['a', 3, 5]] >>> df = pd.DataFrame(lol) >>> df.rename(columns={0:'value', 1:'key', 2:'something'}) value key something 0 a 1 1 1 b 1 2 2 c 1 4 3 c 2 9 4 b 2 10 5 x 2 5 6 d 2 3 7 e 3 5 8 d 2 10 9 a 3 5 

El objective es mantener las últimas N filas para los valores únicos de la columna key .

Si N=1 , simplemente podría usar la función .drop_duplicates() como tal:

 >>> df.drop_duplicates(subset='key', keep='last') value key something 2 c 1 4 8 d 2 10 9 a 3 5 

¿Cómo mantengo las últimas 3 filas para cada valor único de key ?


Podría intentar esto para N=3 :

 >>> from itertools import chain >>> unique_keys = {k:[] for k in df['key']} >>> for idx, row in df.iterrows(): ... k = row['key'] ... unique_keys[k].append(list(row)) ... >>> >>> df = pd.DataFrame(list(chain(*[v[-3:] for k,v in unique_keys.items()]))) >>> df.rename(columns={0:'value', 1:'key', 2:'something'}) value key something 0 a 1 1 1 b 1 2 2 c 1 4 3 x 2 5 4 d 2 3 5 d 2 10 6 e 3 5 7 a 3 5 

Pero debe haber una mejor manera …

Es esto lo que quieres ?

 df.groupby('key').tail(3) Out[127]: value key something 0 a 1 1 1 b 1 2 2 c 1 4 5 x 2 5 6 d 2 3 7 e 3 5 8 d 2 10 9 a 3 5 

¿Esto ayuda?

 for k,v in df.groupby('key'): print v[-2:] value key something 1 b 1 2 2 c 1 4 value key something 6 d 2 3 8 d 2 10 value key something 7 e 3 5 9 a 3 5