使用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
相关产品推荐
相关产品推荐

