Фрейм данных: установка пользовательских значений при группировании

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

             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:

Попробуйте это в части 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
  

Комментарии:

1. Привет @anky_91, все работает нормально. Спасибо.. Если у меня более 10 столбцов для выполнения одних и тех же операций, означает, какой из них будет правильным (другие операции будут использоваться для агрегирования).

2. возможно, вы можете написать настраиваемую функцию. nut agg работает нормально