Python Pandas 统计数据框内两类列的数字出现次数
可直接落地的Pandas实现代码
前置说明
假设你已经通过pd.read_csv()把目标CSV文件加载为DataFrame,存储在变量df中,无需额外调整原数据结构。
完整实现代码
import pandas as pd # 1. 精准拆分两类目标列,避免列名匹配干扰 # 筛选普通ball列:严格匹配以ball_为前缀、后接数字的列,排除extraball列 ball_cols = df.filter(regex=r'^ball_\d+$').columns # 筛选extraball列:直接匹配以extraball_为前缀的列 extra_cols = df.filter(like='extraball_').columns # 2. 生成普通球(1-50范围)统计结果 # 把所有普通球列的值拉平为一维序列后统计频次 ball_freq = pd.Series(df[ball_cols].values.ravel()).value_counts() # 对齐1-50全数字范围,未出现的数字频次填0 ball_stat_df = ball_freq.reindex(range(1, 51), fill_value=0).reset_index() # 重命名列名匹配要求的输出结构 ball_stat_df.columns = ['Number', 'Score'] # 3. 生成特别球(1-9范围)统计结果 extra_freq = pd.Series(df[extra_cols].values.ravel()).value_counts() extra_stat_df = extra_freq.reindex(range(1, 10), fill_value=0).reset_index() extra_stat_df.columns = ['Number', 'Score']
新手易踩坑提示
- 列筛选环节不能直接用模糊匹配
like='ball_'选普通球列,因为extraball的列名中也包含ball_字段,会把extra列错误纳入普通球的统计范围,用正则精确匹配可以完全规避这个问题 - 必须通过
reindex方法对齐全区间数字,否则统计结果只会列出实际出现过的数字,频次为0的未出现数字会缺失,不符合覆盖全范围的输出要求 - 用
values.ravel()拉平多维数组统计的写法,比逐列循环累加计数的写法代码更简洁、运行效率更高,尤其适配大样本数据的统计场景
内容的提问来源于stack exchange,提问作者yilmaz Cam
相关产品推荐
相关产品推荐

