给定此数据帧:
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_time
和lasttrip_time
。然后,在每个HOUSEID
和PERSONID
类别中,将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()
你能帮我做这件事吗?或者给我一个提示?
谢谢
将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
您可以通过TDTRPNUM首先使用sort_values
来避免groupby
,然后使用drop_duplicates
先使用一次STRTTIME来获得具有最小TDTRPNUM的行,最后使用一次ENDTIME来获取具有最大TDTRPNUMmerge
both和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)