#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 работает нормально