基于最小值和最大值制作新的panda列



给定此数据帧:

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

我想制作两个新列firsttrip_timelasttrip_time。然后,在每个HOUSEIDPERSONID类别中,将STRTTIME添加到firsttrip_time以获得最小数量的TDTRPNUM,并将ENDTIME添加到lasttrip_time以获得最大数量的TDTRPNUM

结果:

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

你能帮我做这件事吗?或者给我一个提示?

谢谢

groupbyagg一起使用,最后使用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

您可以通过TDTRPNUM首先使用sort_values来避免groupby,然后使用drop_duplicates先使用一次STRTTIME来获得具有最小TDTRPNUM的行,最后使用一次ENDTIME来获取具有最大TDTRPNUMmergeboth和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

您可以尝试此选项:

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

最新更新