#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. Мило! Поди разберись, я был слишком близоруко сосредоточен на групповщике. Спасибо.