Использование Pandas groupby без числового значения

#python #pandas #dataframe #pandas-groupby

Вопрос:

Я использую Pandas и у меня есть фрейм данных со столбцом даты, столбцом уникального идентификатора и десятком или около того столбцов с числовыми значениями. Следующее достаточно хорошо работает в качестве воспроизводимого примера:

 df = pd.DataFrame(data = {
    'day': ['2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01',
            '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02'],
    'distinct_id': ['a', 'a', 'a', 'b', 'b', 'c', 'a', 'a', 'b', 'c', 'c'],
    'value': [71, 72, 73, 74, 74, 73, 72, 71, 71, 72, 73]
})
 

Я хотел бы сгруппировать day distinct_id только по порядку, опуская все остальные столбцы. Мне просто нужно знать , что в данный day , данный distinct_id момент произошло событие.

 # Desired output
    day         distinct_id
0   2020-10-01  a
1   2020-10-01  b
2   2020-10-01  c
3   2020-10-02  a
4   2020-10-02  b
5   2020-10-02  c
 

Если бы это был SQL, я бы написал что-то похожее на:

 SELECT DISTINCT day, distinct_id FROM df
 

В Панд я не могу понять, как это сделать. Ниже приведен объект groupby, который, как мне кажется, мне нужен:

 df.groupby(['day', 'distinct_id'])

# Output: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7ffd71bbd430>
 

Однако все примеры, которые я могу найти для того, как превратить это в фрейм данных, включают в себя некоторую числовую совокупность. Теоретически я мог бы сделать это, а затем удалить полученные столбцы, вот так…

 df2 = df.groupby(['day', 'distinct_id']).count().reset_index()

# My actual example has a dozen or so columns to drop
cols = ['day', 'distinct_id']
df2.drop([x for x in df.columns if not x in cols], axis = 1)
 

…но это похоже на обходной путь. Есть ли более простой способ добиться этого?

Ответ №1:

Мы можем выбрать эти столбцы, а затем drop_duplicates .

 df = pd.DataFrame(data = {
    'day': ['2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01', '2020-10-01',
            '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02', '2020-10-02'],
    'distinct_id': ['a', 'a', 'a', 'b', 'b', 'c', 'a', 'a', 'b', 'c', 'c'],
    'value': [71, 72, 73, 74, 74, 73, 72, 71, 71, 72, 73]
})

df[['day', 'distinct_id']].drop_duplicates()
 

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

1. Мило! Поди разберись, я был слишком близоруко сосредоточен на групповщике. Спасибо.