You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:02:34