DataFrame:分组时设置用户定义的值

时间:2019-03-21 04:05:54

标签: python pandas dataframe

            user user_id age           swiped_in           swiped_out
        0    Bob       1  53  2019-02-25 09:50:32  2018-02-25 10:50:32
        1   Jane       2  34  2019-02-25 09:50:32  2019-02-25 11:50:32
        2  Alice       3  35  2019-02-25 09:50:32  2019-02-25 12:50:32
        3    Bob       1  54  2019-02-25 10:50:32  2019-02-25 11:30:32
        4    Bob       1  55  2019-02-25 11:31:32  2019-02-25 12:51:32
        5   Jane       2  34  2019-02-25 09:50:32  2019-02-25 11:50:32

这是我的代码。

c = ['swiped_in','swiped_out']
df[c] = df[c].apply(pd.to_datetime)
df = df.sort_values(c)   
df=df.groupby(['user','user_id']).agg({'swiped_in':'min','swiped_out':'max','age':'first'})

现在我可以得到以下输出。

                swiped_in          swiped_out age
user  user_id                                            
Alice 3       2019-02-25 09:50:32 2019-02-25 12:50:32  35
Bob   1       2019-02-25 09:50:32 2019-02-25 12:51:32  53
Jane  2       2019-02-25 09:50:32 2019-02-25 11:50:32  34

我需要的是..

         swiped_in          swiped_out age
user  user_id                                            
Alice 3       2019-02-25 09:50:32 2019-02-25 12:50:32  35
Bob   1       2019-02-25 09:50:32 2019-02-25 12:51:32  ..
Jane  2       2019-02-25 09:50:32 2019-02-25 11:50:32  34

如果年龄相同,那么我可以按原样填写数据。如果不是唯一的,我需要输入自定义的值。

1 个答案:

答案 0 :(得分:0)

在groupby部分中尝试以下操作:

custom_value=5 #change this
df_new=(df.groupby(['user','user_id'])
        .agg({'swiped_in':'min','swiped_out':'max','age':
              lambda x:np.where(x.nunique()==1,next(iter(set(x))),custom_value)}))
print(df_new)


                       swiped_in          swiped_out  age
user  user_id                                             
Alice 3       2019-02-25 09:50:32 2019-02-25 12:50:32   35
Bob   1       2019-02-25 09:50:32 2019-02-25 12:51:32    5
Jane  2       2019-02-25 09:50:32 2019-02-25 11:50:32   34