鉴于此数据框:
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()
您能帮我这个忙还是给我提示?
谢谢
答案 0 :(得分:2)
将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
答案 1 :(得分:1)
您可以先通过TDTRPNUM groupby
来避免sort_values
,然后将drop_duplicates
与STRTTIME一起使用,以最小的TDTRPNUM来获取行,最后一次以ENDTIME的方式来获取行。最大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
答案 2 :(得分:1)
您可以尝试以下选项:
aggFunc = {'STRTTIME':['min'], 'ENDTIME':['max']}
df = df.groupby(['HOUSEID','PERSONID']).agg(aggFunc).reset_index()
print(df)