Pandas如何统计存储字典列表的列中各独立值的出现次数
解决方案
value_counts()默认按单元格整体值统计频次,要统计所有嵌套字典内的独立name值,只需要先把嵌套结构拆成一维的名字序列,再做频次统计即可,下面给两种可直接运行的实现:
方法1:列表推导式写法(小数据量简单直观)
通过两层遍历直接提取所有名字,转成Series后统计,不需要记忆特殊API:
import pandas as pd # 提取所有name值并统计频次,自动跳过非字典格式的异常元素 name_counts = pd.Series( [d.get("name") for cell_list in df["col1"] for d in cell_list if isinstance(d, dict)] ).value_counts()
- 优点:代码逻辑直白好懂,上手快
- 适用场景:万行以内的小数据集
方法2:explode向量化写法(大数据量性能更优)
用pandas原生的explode方法先把列表里的每个字典拆成独立行,再取值统计,属于pandas向量化操作,大样本下运行速度远快于循环写法:
name_counts = ( df["col1"] .explode() # 将列表中每个字典拆分为单独的行 .apply(lambda x: x.get("name") if isinstance(x, dict) else None) .dropna() # 自动跳过空值、格式异常的无效数据 .value_counts() )
- 优点:性能好,链式操作逻辑清晰,方便后续追加其他数据处理逻辑
- 适用场景:十万行以上的较大数据集
运行结果示例
基于你给出的样例数据(修正Barbara缺失的闭合单引号语法问题后),运行得到的统计结果如下:
John 2 Mark 2 Susan 1 Mr.Bean 1 The Smiths 1 Barbara 1 Poly 1 Nick 1 Name: count, dtype: int64
提示:如果数据中存在空列表、缺失值、非字典格式的脏数据,上述代码里加的类型判断和
dropna()逻辑会自动跳过异常内容,不会中断代码运行。
内容的提问来源于stack exchange,提问作者bonnenhoodyahoocom
相关产品推荐
相关产品推荐

