DataFrame中含双字典列表的名称频次统计及空值处理优化咨询
解决方案
方法1:Pandas链式操作(简洁推荐)
利用explode拆分列表、json_normalize解析字典,一步到位提取并处理name字段:
import pandas as pd # 假设你的DataFrame列名为'data' # 1. 把每个单元格的列表拆成单独行 exploded_df = df['data'].explode() # 2. 将字典结构展开为列 normalized_df = pd.json_normalize(exploded_df) # 3. 过滤空值(含NaN、空字符串、纯空白字符串)并统计频次 name_counts = normalized_df['name'].dropna()\ .replace(r'^\s*$', pd.NA, regex=True)\ .dropna()\ .value_counts() print(name_counts)
explode():将每个单元格内的列表拆分为独立行,每个字典占一行pd.json_normalize():把字典的键转为DataFrame列,直接获取name字段- 双重
dropna+正则替换:彻底清除NaN、空字符串和仅含空白的字符串
方法2:列表推导式(高效灵活)
适合大数据量场景,直接过滤非空name后统计:
# 提取所有有效name(排除NaN、空值、纯空白) names = [ item['name'].strip() # 顺便去掉首尾空格,避免"Human "和"Human"被当成不同值 for sublist in df['data'] for item in sublist if pd.notna(item['name']) and item['name'].strip() != '' ] # 统计频次 name_counts = pd.Series(names).value_counts() print(name_counts)
- 双层遍历:先遍历每个单元格的列表,再遍历列表内的每个字典
- 条件判断:同时排除NaN和无意义的空白值
- 提前
strip():避免因首尾空格导致的统计误差
你的原始代码优化版
保留你的循环思路,同时优化空值处理和灵活性:
aux_list = [] for sublist in df['data']: for item in sublist: # 不用硬编码索引,适配列表长度变化 name = item['name'].strip() if pd.notna(item['name']) else '' if name: # 仅保留非空有效name aux_list.append(name) name_counts = pd.Series(aux_list).value_counts()
内容的提问来源于stack exchange,提问作者user21653047
相关产品推荐
相关产品推荐

