如何将含字典的Pandas DataFrame行拆分为邮箱与列表列
解决DataFrame嵌套字典拆分问题
这问题我之前处理API返回数据时也碰到过,这种每行只有单个键值对的字典结构,用pandas的apply方法就能轻松拆分出你要的两列。
步骤1:先模拟你的原始数据(方便测试)
首先我们先构造和你描述一致的DataFrame:
import pandas as pd # 模拟API返回后生成的原始DataFrame raw_data = [ {'email@email.com': [{'action': 'data', 'date': 'date'}, {'action': 'data', 'date': 'date'}]}, {'different-email@email.com': [{'action': 'data', 'date': 'date'}]} ] df = pd.DataFrame(raw_data, columns=['Column'])
步骤2:拆分字典到目标列
因为每行的字典只有一个键值对,我们可以用next(iter(d.items()))快速提取唯一的邮箱(键)和对应的动作列表(值)。这里有两种写法,选你顺手的就行:
写法1:自定义函数(可读性更强)
def extract_email_and_actions(row): # 提取当前行字典里的唯一键值对 email, action_list = next(iter(row['Column'].items())) # 返回指定列名的Series,方便合并到原DataFrame return pd.Series([email, action_list], index=['Column1', 'Column2']) # 按行应用函数,替换原DataFrame df = df.apply(extract_email_and_actions, axis=1)
写法2:Lambda简写(更简洁)
如果喜欢精简代码,用lambda一行搞定:
df = df['Column'].apply(lambda x: pd.Series(next(iter(x.items())), index=['Column1', 'Column2']))
最终效果
运行后你得到的DataFrame就会是你想要的结构:
Column1 Column2 0 email@email.com [{'action': 'data', 'date': 'date'}, {'action... 1 different-email@email.com [{'action': 'data', 'date': 'date'}]
这个方法的好处是不管你的邮箱字符串是什么格式,只要每行的字典只有一个键,就能准确拆分,完美适配API返回的这种结构。
内容的提问来源于stack exchange,提问作者DBa
相关产品推荐
相关产品推荐

