Dado este marco de datos:

    HOUSEID     PERSONID    STRTTIME    ENDTIME TDTRPNUM
0   20000017    1            955          1020     1
1   20000017    1           1130          1132     2
2   20000017    1           1330          1400     3
3   20000017    2            958          1020     1
4   20000017    2           1022          1025     2
5   20000017    2           1120          1122     3
6   20000017    2           1130          1132     4

Quiero crear 2 columnas nuevas firsttrip_time y lasttrip_time. Luego, agregue STRTTIME a firsttrip_time para el número mínimo de TDTRPNUM, y agregue ENDTIME a lasttrip_time para el número máximo de TDTRPNUM en cada Categoría HOUSEID y PERSONID.

Resultados:

    HOUSEID     PERSONID    firsttrip_time  lasttrip_time   
0   20000017      1          955              1400             
1   20000017      2          958              1132      

He intentado esto para obtener la mezcla y el máximo, pero no tengo idea de cómo continuar el proceso.

grouped = df.groupby(['HOUSEID', 'PERSONID','STRTTIME', 'ENDTIME'])['TDTRPNUM']
max = grouped.max()
min = grouped.min()

¿Puedes ayudarme con esto o darme una pista?

Gracias

2
ali bakhtiari 27 ago. 2020 a las 15:22

3 respuestas

La mejor respuesta

Use groupby con agg y, finalmente, rename sus columnas:

print (df.sort_values(["HOUSEID","PERSONID","TDTRPNUM"])
         .groupby(["HOUSEID", "PERSONID"], as_index=False)
         .agg({"STRTTIME":"first","ENDTIME":"last"})
         .rename(columns={"STRTTIME":"firsttrip_time","ENDTIME":"lasttrip_time"}))

    HOUSEID  PERSONID  firsttrip_time  lasttrip_time
0  20000017         1             955           1400
1  20000017         2             958           1132
2
Henry Yik 27 ago. 2020 a las 13:07

Puede evitar groupby primero sort_values por TDTRPNUM y luego usar drop_duplicates con una vez primero con STRTTIME para obtener la fila con un mínimo de TDTRPNUM y una última vez con ENDTIME para obtener la fila con un máximo de TDTRPNUM , merge ambos y rename para obtener el resultado esperado

df_ = df.sort_values('TDTRPNUM')
res = (df_.drop_duplicates(['HOUSEID','PERSONID'], keep='first')
          [['HOUSEID','PERSONID', 'STRTTIME']]\
          .merge(df_.drop_duplicates(['HOUSEID','PERSONID'], keep='last')
                    [['HOUSEID','PERSONID', 'ENDTIME']])\
          .rename(columns={'STRTTIME':'firsttrip_time', 
                           'ENDTIME':'lasttrip_time'})
      )
print(res)
    HOUSEID  PERSONID  firsttrip_time  lasttrip_time
0  20000017         1             955           1400
1  20000017         2             958           1132
1
Ben.T 27 ago. 2020 a las 12:37

Puedes probar esta opción:

aggFunc = {'STRTTIME':['min'], 'ENDTIME':['max']}
df = df.groupby(['HOUSEID','PERSONID']).agg(aggFunc).reset_index()
print(df)
1
Soumendra Mishra 27 ago. 2020 a las 13:32
63615917