Pandas处理大型CSV 按玩家等级统计最常用道具方案
各玩家等级最高使用率道具统计方案
原有代码问题
最初写的单等级统计代码存在两个核心问题,是和Excel countifs校验结果不一致的原因:
- 直接对筛选后的DataFrame调用
mode()方法时,如果某一道具列存在多个频次并列最高的取值,方法会返回所有并列结果,而非单值,和countifs默认返回首个匹配最高频值的逻辑不匹配 - 仅支持手动指定单个等级计算,无法自动遍历1-30级完成批量统计
用到的测试数据集结构示例如下:
| index | playerLevel | playerKnife | playerBackpack |
|---|---|---|---|
| 0 | 1 | knife_1 | backpack_1 |
| 1 | 2 | knife_2 | backpack_1 |
| 2 | 3 | knife_1 | backpack_2 |
| 3 | 1 | knife_2 | backpack_1 |
| 4 | 2 | knife_3 | backpack_2 |
| 5 | 1 | knife_1 | backpack_1 |
| 6 | 15 | knife_13 | backpack_12 |
| 7 | 13 | knife_10 | backpack_9 |
| 8 | 1 | knife_1 | backpack_2 |
批量统计实现代码
直接用pandas分组聚合即可一次性完成全等级统计,不需要手动写循环逐等级筛选,代码如下:
import pandas as pd # 读取数据集并提取需要的核心列 df = pd.read_csv('filename.csv') df = df[["playerLevel", "playerKnife", "playerBackpack"]] # 按玩家等级分组,分别计算每组最高频的刀具、背包 level_top_item = df.groupby("playerLevel").agg( top_knife=("playerKnife", lambda col: col.value_counts().index[0]), top_backpack=("playerBackpack", lambda col: col.value_counts().index[0]) ).reset_index() # 补全1-30全等级序列,无玩家数据的等级对应道具列显示为空值 level_top_item = level_top_item.set_index("playerLevel").reindex(range(1, 31)).reset_index() # 打印输出结果 print(level_top_item)
逻辑说明
groupby("playerLevel")会自动按等级拆分数据集,替代手动逐等级筛选的操作- 每个分组内用
value_counts()对道具取值做频次统计,返回结果默认按频次降序排列,取索引第一位即为该等级使用人数最多的道具,遇到并列最高频的情况默认取排序首位的取值,和Excel countifs的统计逻辑对齐 - 最后通过
reindex补全1到30的完整等级序列,避免出现高等级无玩家数据时结果缺行的问题,方便后续核对
内容的提问来源于stack exchange,提问作者miamas
相关产品推荐
相关产品推荐

