如何用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
相关产品推荐
相关产品推荐

