使用没有数值的 Pandas groupby
Using Pandas groupby without a numeric value
我正在使用 Pandas 并且有一个包含日期列、唯一 ID 列和十几个带有数值的列的数据框。以下作为可重现的示例效果很好:
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
在Pandas中,我不知道该怎么做。下面是我认为我想要的groupbyobject:
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)
...但这感觉像是一种解决方法。有没有更直接的方法来实现这个?
我们可以 select 这些列,然后 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()
我正在使用 Pandas 并且有一个包含日期列、唯一 ID 列和十几个带有数值的列的数据框。以下作为可重现的示例效果很好:
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
在Pandas中,我不知道该怎么做。下面是我认为我想要的groupbyobject:
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)
...但这感觉像是一种解决方法。有没有更直接的方法来实现这个?
我们可以 select 这些列,然后 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()