Pandas: consigue la primera aparición agrupando por claves.

Si tengo el siguiente dataframe

| id | timestamp | code | id2 | 10 | 2017-07-12 13:37:00 | 206 | a1 | 10 | 2017-07-12 13:40:00 | 206 | a1 | 10 | 2017-07-12 13:55:00 | 206 | a1 | 10 | 2017-07-12 19:00:00 | 206 | a2 | 11 | 2017-07-12 13:37:00 | 206 | a1 ... 

Necesito agrupar por id, id2 columnas id, id2 y obtener la primera vez que aparezca el valor de timestamp de timestamp , por ejemplo, para id=10, id2=a1, timestamp=2017-07-12 13:37:00 .

Lo busqué en Google y encontré algunas soluciones posibles, pero no puedo averiguar cómo realizarlas correctamente. Esto probablemente debería ser algo como:

 df.groupby(["id", "id2"])["timestamp"].apply(lambda x: ....) 

Creo que necesitas GroupBy.first :

 df.groupby(["id", "id2"])["timestamp"].first() 

O drop_duplicates :

 df.drop_duplicates(subset=['id','id2']) 

Para la misma salida:

 df1 = df.groupby(["id", "id2"], as_index=False)["timestamp"].first() print (df1) id id2 timestamp 0 10 a1 2017-07-12 13:37:00 1 10 a2 2017-07-12 19:00:00 2 11 a1 2017-07-12 13:37:00 df1 = df.drop_duplicates(subset=['id','id2'])[['id','id2','timestamp']] print (df1) id id2 timestamp 0 10 a1 2017-07-12 13:37:00 1 10 a2 2017-07-12 19:00:00 2 11 a1 2017-07-12 13:37:00 

Uno puede crear una nueva columna después de fusionar las cadenas id y id2, luego eliminar las filas donde está duplicada:

 df['newcol'] = df.apply(lambda x: str(x.id) + str(x.id2), axis=1) df = df[~df.newcol.duplicated()].iloc[:,:4] # iloc used to remove new column. print(df) 

Salida:

  id timestamp code id2 0 10 2017-07-12 13:37:00 206 a1 3 10 2017-07-12 19:00:00 206 a2 4 11 2017-07-12 13:37:00 206 a1