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

使用Pandas规范化含列表嵌套字典的邮件数据集

解析动态嵌套邮箱列表,实现高效搜索

嘿,我来帮你搞定这个嵌套邮箱列表的解析问题!你之前的方法之所以只能处理第一个邮箱还会报错,是因为直接把列表转成多列的方式没法适配动态长度的邮箱列表,而且空列的None值会干扰json_normalize的执行。咱们换个思路,用explode先把列表拆成单行,再统一解析,完美解决动态数据的问题。

解决方案代码

import pandas as pd

email_data = [{ "id": "random_id_1", "to": [{"name": "A", "email": "a@example.com"}], "cc": [{"name": "B", "email": "b@example.com"}, {"name": "C", "email": "c@example.com"}], "bcc": [] }, { "id": "random_id_2", "to": [{"name": "D", "email": "d@example.com"}], "cc": [{"name": "E", "email": "e@example.com"}], "bcc": [] }, { "id": "random_id_3", "to": [{"name": "F", "email": "f@example.com"}], "cc": [{"name": "G", "email": "g@example.com"}, {"name": "H", "email": "h@example.com"}], "bcc": [] }]

# 1. 转换为基础DataFrame,保留邮件标识id
email_df = pd.DataFrame(email_data)

# 2. 处理to字段:拆分列表为单行,解析邮箱信息
to_expanded = email_df[['id']].join(email_df['to'].explode()).dropna(subset=['to'])
to_normalized = pd.json_normalize(to_expanded['to']).join(to_expanded['id'])

# 3. 处理cc字段:复用同样的逻辑
cc_expanded = email_df[['id']].join(email_df['cc'].explode()).dropna(subset=['cc'])
cc_normalized = pd.json_normalize(cc_expanded['cc']).join(cc_expanded['id'])

# 4. 合并所有收件人/抄送人,标记类型方便区分
all_recipients = pd.concat([
    to_normalized.assign(type='to'),
    cc_normalized.assign(type='cc')
]).reset_index(drop=True)

# 示例:根据邮箱地址搜索对应的邮件
target_email = "b@example.com"
matching_emails = all_recipients[all_recipients['email'] == target_email]
print(matching_emails)

代码解释

  • explode():把每个邮件的to/cc列表拆成单独的行,同时保留原邮件的id,这样每个邮箱都能和对应的邮件关联起来,不管列表里有多少个邮箱都能处理。
  • dropna(subset=['to']):过滤掉空列表拆出来的NaN行,避免后续解析出错。
  • json_normalize():把字典格式的邮箱信息({"name": "...", "email": "..."})解析成单独的name和email列,直接得到结构化数据。
  • 合并结果:把to和cc的结果合并,加上type标记,方便你后续区分是收件人还是抄送人,也能统一进行搜索操作。

这样处理后,你就可以轻松根据邮箱地址筛选对应的邮件了,完全适配动态变化的数据集,不用再担心硬编码列数或者空值报错的问题~

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:22:57