如何将含嵌套字典与列表的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)
运行输出验证
执行上述代码后,最终输出结构为:
| ID | Visibility | CounterStrike | TF2 | Isaac | Bioshock |
|---|---|---|---|---|---|
| 7541 | yes | 45 | 14 | None | None |
| 4878 | no | None | None | None | None |
| 1014 | yes | 1 | None | 85 | 10 |
常见踩坑提示
- 注意区分字符串类型的
"None"和Python原生的None:如果直接对字符串"None"执行zip操作,会逐字符遍历字符串,导致数据完全错位 - 列顺序调整:游戏列默认按照首次采集到的顺序排列,如果需要固定列顺序,可在拼接完成后通过列索引重新指定顺序,例如
final_df = final_df[["ID", "Visibility", "CounterStrike", "TF2", "Isaac", "Bioshock"]] - 后续新增游戏的兼容:如果采集到新的游戏名称,无需手动调整代码逻辑,pandas会自动识别新的游戏名生成对应列,自动补全其他用户的缺失值
内容的提问来源于stack exchange,提问作者Jauhnax
相关产品推荐
相关产品推荐

