如何从含嵌套字典的字典创建DataFrame并将以'ga:'开头的键设为列?
一、从嵌套字典创建DataFrame
先来说第一个需求,嵌套字典转DataFrame分两种常见场景,我给你举两个实用的例子:
场景1:外层字典键作为行索引,内层字典的键作为列
比如你有这样的嵌套字典:
nested_dict = { "row1": {"col1": 1, "col2": 2}, "row2": {"col1": 3, "col2": 4} }
直接用pd.DataFrame就能生成DataFrame,外层键会自动成为索引,转置后结构更符合常规:
import pandas as pd df = pd.DataFrame(nested_dict).T print(df)
或者用from_dict指定orient='index',效果是一样的:
df = pd.DataFrame.from_dict(nested_dict, orient='index')
场景2:内层字典是独立的行数据
如果嵌套字典是列表形式,每个内层字典对应一行数据:
nested_dict = [ {"col1": 1, "col2": 2}, {"col1": 3, "col2": 4} ]
直接传入DataFrame构造函数即可生成标准结构的表格:
df = pd.DataFrame(nested_dict)
二、处理你的特定数据集,提取ga:开头的键作为列
你的数据集里有nan值,还有字符串形式的字典,我们分步骤来处理:
步骤1:导入依赖并定义原始数据
import pandas as pd import numpy as np from ast import literal_eval # 用这个安全解析字符串格式的字典,比eval更稳妥 raw_data = { 0: np.nan, 1: np.nan, 2: "{'ga:productSku': 148223, 'ga:dimension16': '4511', 'ga:productName': 'Amargo Terma Serrano 1.35 L','ga:productCategoryHierarchy': '/Almacén/Bebidas/Aguas/Gaseosas/Jugos/A Base de Hierbas'}", 3: "{'ga:productSku': 248146, 'ga:dimension16': '1001', 'ga:productName': 'Aperitivo Cynar 900 Ml', 'ga:productCategoryHierarchy': '/Almacén/Bebidas/Aguas/Gaseosas/Jugos/Aperitivos'}" }
步骤2:解析字符串字典并过滤有效数据
先把原始数据转成Series,过滤掉空值后,将字符串解析为真实字典:
# 转成Series方便逐个处理数据 s = pd.Series(raw_data) # 过滤掉nan值,再把字符串格式的字典转成Python字典 parsed_dicts = s.dropna().apply(literal_eval)
步骤3:提取ga:开头的键生成DataFrame
直接把解析后的字典传入DataFrame,Pandas会自动把字典的键作为列——刚好就是你需要的ga:开头的字段:
# 如果不需要保留原始索引(2、3),可以用tolist() df = pd.DataFrame(parsed_dicts.tolist()) # 如果想保留原始索引,用下面的写法 # df = pd.DataFrame.from_dict(parsed_dicts.to_dict(), orient='index') print(df)
保留空值行的进阶处理
如果想保留原始的0、1行(空值行),可以用try-except包裹解析逻辑,避免报错:
def parse_ga_dict(value): if pd.isna(value): return {} # 空值返回空字典,保证后续能生成空行 try: return literal_eval(value) except: return {} # 解析失败也返回空字典 # 解析所有数据,包括nan值 all_parsed = s.apply(parse_ga_dict) df = pd.DataFrame(all_parsed.tolist(), index=s.index)
最终效果
运行后你会得到这样的DataFrame:
ga:productSku ga:dimension16 ga:productName ga:productCategoryHierarchy
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 148223 4511 Amargo Terma Serrano 1.35 L /Almacén/Bebidas/Aguas/Gaseosas/Jugos/A Base de Hierbas
3 248146 1001 Aperitivo Cynar 900 Ml /Almacén/Bebidas/Aguas/Gaseosas/Jugos/Aperitivos
内容的提问来源于stack exchange,提问作者Jose Miguel Gonzalez Larrain

