создание новых столбцов панд на основе минимальных и максимальных значений

#python #pandas

Вопрос:

учитывая этот фрейм данных:

     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
 

Я хочу сделать 2 новых столбца firsttrip_time и lasttrip_time . Затем добавьте STRTTIME firsttrip_time к минимальному количеству TDTRPNUM и добавьте ENDTIME lasttrip_time к максимальному количеству TDTRPNUM в каждой HOUSEID PERSONID категории и.

Результаты:

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

Я пробовал это, чтобы получить смесь и максимум, но понятия не имею, как продолжить процесс?

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

Можете ли вы помочь мне с этим или дать мне подсказку?

Спасибо

Ответ №1:

Используйте groupby с agg , и, наконец rename , ваши столбцы:

 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:

вы можете избежать groupby сначала sort_values по TDTRPNUM, а затем использовать drop_duplicates с один раз сначала с STRTTIME, чтобы получить строку с минимальным TDTRPNUM, и один раз последним с КОНЕЧНЫМ временем, чтобы получить строку с максимальным TDTRPNUM, merge как и rename для получения ожидаемого результата

 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
 

Ответ №3:

Вы можете попробовать этот вариант:

 aggFunc = {'STRTTIME':['min'], 'ENDTIME':['max']}
df = df.groupby(['HOUSEID','PERSONID']).agg(aggFunc).reset_index()
print(df)