根据最小值和最大值创建新的熊猫列

时间:2020-08-27 12:22:52

标签: 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_timelasttrip_time。然后,将STRTTIME添加到firsttrip_time中,以获取最小数量的TDTRPNUM,然后将ENDTIME添加到lasttrip_time中,以获取最大数量的TDTRPNUM HOUSEIDPERSONID类别。

结果:

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

您能帮我这个忙还是给我提示?

谢谢

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以先通过TDTRPNUM groupby来避免sort_values,然后将drop_duplicates与STRTTIME一起使用,以最小的TDTRPNUM来获取行,最后一次以ENDTIME的方式来获取行。最大TDTRPNUM,mergerename都可以获得预期的输出

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)