You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas实现按会员类型分组的骑行次数及占比统计?

按会员类型分组统计骑行次数及占比的Pandas优化方案

需求说明

生成表格,展示按会员类型(casual、member)分组的骑行次数及占比统计。

R语言实现代码

big_frame %>% 
     group_by(member_casual) %>% 
     summarise(count = length(ride_id),
               '%' = round((length(ride_id) / nrow(big_frame)) * 100, digit=2))

现有Pandas尝试代码

member_casual_count = (
    big_frame
    .filter(['member_casual'])
    .value_counts(normalize=True).mul(100).round(2)
    .reset_index(name='percentage')
)

member_casual_count['count'] = (
    big_frame
    .filter(['member_casual'])
    .value_counts()
    .tolist()  
)
member_casual_count

优化后的Pandas实现方案

方案一:单次聚合完成统计

和R语言的实现逻辑对齐,通过groupby+agg一次性完成计数和占比计算,仅需遍历数据一次,效率更高:

member_casual_stats = (
    big_frame
    .groupby('member_casual', as_index=False)
    .agg(
        count=('ride_id', 'count'),  # 统计每组骑行次数
        percentage=('ride_id', lambda x: round((len(x) / len(big_frame)) * 100, 2))
    )
)
member_casual_stats

方案二:先计数再推导占比

如果觉得lambda不够直观,可以先计算各组计数,再通过assign推导占比,逻辑更清晰:

member_casual_stats = (
    big_frame
    .groupby('member_casual')['ride_id']
    .count()
    .reset_index(name='count')
    .assign(percentage=lambda df: round((df['count'] / len(big_frame)) * 100, 2))
)
member_casual_stats

优化点说明

  • 避免两次调用value_counts,减少数据遍历次数,提升运行效率
  • 代码结构紧凑,逻辑和R实现一致,可读性更强
  • 直接基于ride_id统计,和原R代码的统计维度完全匹配

内容的提问来源于stack exchange,提问作者A C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:20:42