You need to enable JavaScript to run this app. 如何将含嵌套字典与列表的Steam采集数据字典转换为目标结构Pandas DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套字典与列表的Steam采集数据字典转换为目标结构Pandas DataFrame

嵌套字典转目标结构DataFrame实现方案

步骤1:准备可运行的输入数据

原示例中游戏名称未加字符串引号,直接运行会触发Python名称错误,修正后的可运行输入如下:

import pandas as pd

example_dict = {
    "AUTHID": [7541, 4878, 1014],
    "visibility": ["Yes", "No", "Yes"],
    "game_owned": {
        "game_name": [["CounterStrike", "TF2"], "None", ["CounterStrike", "Isaac", "Bioshock"]],
        "game_playtime": [[45, 14], "None", [1, 85, 10]]
    }
}

步骤2:构建用户基础信息表

提取最外层的非嵌套字段,统一列名匹配目标表结构:

base_df = pd.DataFrame({
    "ID": example_dict["AUTHID"],
    # 按照目标格式将可见性值转为小写
    "Visibility": [vis.lower() for vis in example_dict["visibility"]]
})

步骤3:生成游戏维度宽表

核心逻辑是将每个用户对应的游戏名称与游玩时长配对,利用pandas自动展开字典列表的能力生成宽表,自动处理缺失值:

game_names_all = example_dict["game_owned"]["game_name"]
playtimes_all = example_dict["game_owned"]["game_playtime"]

user_game_dict_list = []
for games, playtimes in zip(game_names_all, playtimes_all):
    # 适配无游戏记录的用户(对应值为字符串"None")
    if games == "None":
        user_game_dict_list.append({})
        continue
    # 配对生成单个用户的 游戏名:游玩时长 映射
    user_game_dict_list.append(dict(zip(games, playtimes)))

# 转宽表,将默认的NaN缺失值替换为目标要求的None
game_df = pd.DataFrame(user_game_dict_list).fillna(None)

步骤4:拼接得到最终结果

将用户基础信息表与游戏宽表按索引横向拼接,即可得到目标结构的DataFrame:

final_df = pd.concat([base_df, game_df], axis=1)

运行输出验证

执行上述代码后,最终输出结构为:

IDVisibilityCounterStrikeTF2IsaacBioshock
7541yes4514NoneNone
4878noNoneNoneNoneNone
1014yes1None8510

常见踩坑提示

  • 注意区分字符串类型的"None"和Python原生的None:如果直接对字符串"None"执行zip操作,会逐字符遍历字符串,导致数据完全错位
  • 列顺序调整:游戏列默认按照首次采集到的顺序排列,如果需要固定列顺序,可在拼接完成后通过列索引重新指定顺序,例如final_df = final_df[["ID", "Visibility", "CounterStrike", "TF2", "Isaac", "Bioshock"]]
  • 后续新增游戏的兼容:如果采集到新的游戏名称,无需手动调整代码逻辑,pandas会自动识别新的游戏名生成对应列,自动补全其他用户的缺失值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 03:36:04