Pandas groupby count 唯一非累积

Pandas groupby count unique non cumulative

提问人:josepmaria 提问时间:11/14/2023 最后编辑:josepmaria 更新时间:11/14/2023 访问量:61

问:

我有这个玩具数据集

df=pd.DataFrame({'user':['John','Steve','Steve','Steve','Jane','Jane','Jane','Jane','Alice','Alice','Alice'],
                  'days':[1,1,2,3,1,2,3,4,1,2,3]})

屈服

user  days
John    1
Steve   1
Steve   2
Steve   3
Jane    1
Jane    2
Jane    3
Jane    4
Alice   1
Alice   2
Alice   3

我希望仅计算 1 天、仅 2 天和仅 3 天的确切用户数量。

所需输出

user   days_count
1           1
3           2
4           1

我已经尝试了这个答案和这个答案中的代码,但上面没有产生(或类似的结果)

熊猫 计数 累计总和

评论

1赞 mozway 11/14/2023
为了清楚起见,你能分解一下 // 的计算吗?121

答:

2赞 mozway 11/14/2023 #1

看起来像一个双value_counts

df['user'].value_counts(sort=False).value_counts(sort=False)

输出:

count
1    1
3    2
4    1
Name: count, dtype: int64

对于确切的格式:

out = (df['user'].value_counts(sort=False)
       .value_counts(sort=False)
       .rename_axis('user')
       .reset_index(name='days_count')
      )

或:

from collections import Counter

c = Counter(Counter(df['user']).values())

out = pd.DataFrame({'user': c.keys(), 'day_count': c.values()})

输出:

   user  days_count
0     1           1
1     3           2
2     4           1
2赞 Suraj Shourie 11/14/2023 #2

有很多方法可以做到这一点,数据集的一种方法是:

df.drop_duplicates(subset='user', keep='last').groupby('candies').count()

输出:

        user
candies      
1           1
3           2
4           1