#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)