Панды: как написать группу плюс агрегацию, которая может группироваться по одному или нескольким столбцам?

#python #pandas

#питон #панды

Вопрос:

Как я могу использовать эту операцию агрегирования groupby plus таким образом, чтобы она могла гибко обрабатывать один или несколько столбцов groupby?

 # some data df = pd.DataFrame({'col1': [1, 5, 1, 2, 2, 2], 'col2': [2, 2, 2, 3, 3, 3], 'col3': [999, 999, 999, 999, 999, 999],  'time': ['2020-01-25 12:24:33', '2020-01-25 14:24:33', '2020-01-25 18:24:33',  '2020-01-25 09:24:33', '2020-01-25 10:24:33', '2020-01-25 11:24:33']})  # convert time df['time'] = pd.to_datetime(df['time'])  # groupby with one col, works df.groupby(['col1', df['time'].dt.floor('d')]).tail(1)  # how to use this structure while being flexibly able to group by one or more cols? two_cols = ['col1', 'col2'] df.groupby([two_cols, df['time'].dt.floor('d')]).tail(1)  

Ожидаемый результат одинаков для обеих операций:

 col1 col2 col3 time  5 2 999 2020-01-25 14:24:33  1 2 999 2020-01-25 18:24:33  2 3 999 2020-01-25 11:24:33  

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

1. пожалуйста, добавьте свой ожидаемый выходной фрейм данных, объяснив при этом, чего вы хотите достичь

Ответ №1:

Панды ищут список меток для groupby() функции, и поэтому нам нужно убедиться, что мы даем им список. Я верю, что это работает.

 df.groupby(two_cols   [df['time'].dt.floor('d')]).tail(1)  

Вы можете видеть, что наш параметр в groupby() -это наш список two_cols другой список (в [] ), который содержит только df['time']... серию. Таким образом, мы объединяем два списка в новый объект listobject, и это то, что groupby() будет работать дальше.