如何高效将pandas DataFrame列表转为列-值对计数字典
多DataFrame列值对计数字典高效实现
原三步实现方案存在多轮重复遍历的性能问题,完全可以通过单次遍历完成字典构建和计数,不需要提前做元组提取、去重初始化的预处理操作。
优化思路
- 用
collections.defaultdict(int)作为计数容器,遍历过程中动态新增键,不需要提前收集所有可能的(列名, 取值)元组做初始化 - 逐DataFrame处理时,直接提取每一列的去重有效值,同一个DataFrame中重复出现的(列名, 取值)只计数1次,完全匹配原逻辑的计数规则(即只要值在当前df对应列存在就加1,不统计单df内的行级出现次数)
- 全流程仅做一次全量遍历,没有双层循环的重复校验开销,时间复杂度从原方案的O(总数据量 + 唯一键数*df总数)降到O(总数据量),性能提升明显。
实现代码
from collections import defaultdict import pandas as pd def count_col_val_pairs(df_list: list[pd.DataFrame]) -> dict: count_res = defaultdict(int) for df in df_list: # 逐列提取非空唯一值 for col in df.columns: # 跳过空值,取当前列所有不重复的取值 for val in df[col].dropna().unique(): count_res[(col, val)] += 1 return dict(count_res)
逻辑对齐说明
- 自动过滤NaN空值,和原方案提取有效元组的逻辑一致
- 单df内同一列的相同取值不会重复计数,和原方案“检查取值是否存在于当前df对应列,存在则计数+1”的规则完全一致
- 不需要任何前置预处理步骤,遍历过程中同步完成键创建、计数累加两个操作,没有冗余计算
如果单df数据量极大,可以将取唯一值的操作替换为
pd.unique(df[col].dropna()),该方法不会对结果做排序,速度比默认的unique()更快。
内容的提问来源于stack exchange,提问作者Ammar Sabir Cheema
相关产品推荐
相关产品推荐

