如何使用Pandas按用户百分位数分组统计评论总数(替代自定义循环实现)
我来帮你搞定这个问题!你想要的统计效果完全可以用Pandas的工具链实现,不用自己写循环,代码更简洁易维护~
核心问题在于:你需要的是按用户数量的百分位数区间来统计(比如前10%的用户群体,不管他们的评论数多少,只要是用户数量占前10%),而不是按评论数的数值分位数来分箱。之前用qcut没成功,大概率是直接对count列分箱了,那会按评论数的数值区间划分,和你的需求不符。
下面是具体的实现步骤,完全贴合你的需求:
步骤1:先对用户按评论数降序排序
首先把数据按用户的评论数(count列)从多到少排序,这样最活跃的用户会排在前面,方便后续按用户数量划分百分位数区间:
# 假设你的数据集存储在DataFrame df中 sorted_df = df.sort_values(by='count', ascending=False)
步骤2:用qcut按用户数量划分百分位数区间
这里我们用排序后的索引来分箱(因为索引是连续的,能保证每个区间的用户数量相等),同时设置对应的区间标签:
# 定义要划分的区间数量,比如你之前的5个区间(每个占20%用户) n_bins = 5 # 生成对应的标签,比如"前100%-80%用户"对应最活跃的20%用户 labels = [f'前{100 - i*20}%-{100 - (i+1)*20}%用户' for i in range(n_bins)] # 给每个用户标记所属的百分位数区间 sorted_df['user_percentile'] = pd.qcut( x=sorted_df.index, # 用索引来等分用户数量 q=n_bins, # 分成n_bins个等用户数的区间 labels=labels )
步骤3:分组统计每个区间的评论总数
按标记的区间分组,对count列求和就能得到每个区间的总评论数:
# 分组求和,得到每个区间的评论总数 percentile_count = sorted_df.groupby('user_percentile')['count'].sum().reset_index()
步骤4:格式化输出成你想要的样式
最后把结果转成你期望的“X%-Y%用户:XXK条评论”格式:
for _, row in percentile_count.iterrows(): # 把总数转换成K单位(保留整数) total_k = f'{row["count"] / 1000:.0f}K' print(f'# {row["user_percentile"]}:{total_k}条评论')
扩展:如果要划分10个区间(每个10%用户)
只需要调整n_bins和标签生成逻辑即可:
n_bins = 10 labels = [f'前{100 - i*10}%-{100 - (i+1)*10}%用户' for i in range(n_bins)]
用这个方法得到的结果和你之前循环实现的完全一致,而且代码更简洁,还能灵活调整区间数量~
内容的提问来源于stack exchange,提问作者FrenchMajesty
相关产品推荐
相关产品推荐

