如何将值为列表的字典转换为展示值计数的DataFrame
实现方法
不需要手动写循环统计频次,直接用pandas配合标准库的计数工具就能快速得到目标结果,完整代码如下:
import pandas as pd from collections import Counter # 原始输入字典 raw_dict = { 1:['A','B','B','C'], 2:['A','B','C','D','D','E','E','E','E'], 3:['C','C','C','D','D','D','D'] } # 统计每个索引下的元素出现次数,构造DataFrame df = pd.DataFrame({idx: Counter(val_list) for idx, val_list in raw_dict.items()}).T.fillna(0).astype(int) # 按字母顺序排序列,和示例输出格式对齐 df = df[sorted(df.columns)]
运行后输出的结果和你给出的目标效果完全一致:
A B C D E 1 1 2 1 0 0 2 1 1 1 2 4 3 0 0 3 4 0
代码逻辑说明
Counter(val_list)会直接统计当前列表里每个元素的出现次数,返回{元素值: 计数}格式的结果- 把每个索引对应的计数结果传入DataFrame构造器后做转置,行索引就自动对应原始字典的键
- 计数为0的单元格默认会被填充为缺失值NaN,用
fillna(0)补成0后转成整数类型即可 - 最后对列名做排序,避免列顺序因为元素出现先后不同乱序,保证输出格式和示例一致
如果处理的数据量比较大,也可以用pandas原生的交叉统计方法实现,不需要导入Counter:
# 大数据量场景写法 s = pd.Series(raw_dict).explode().reset_index() s.columns = ['row_idx', 'col_name'] df = pd.crosstab(s['row_idx'], s['col_name'])
这个写法的输出结果和上面完全一致,crosstab会自动统计行、列维度的共现次数,不存在的组合默认填充0。
内容的提问来源于stack exchange,提问作者CKR
相关产品推荐
相关产品推荐

