Pandas DataFrame中如何规范化字典类型列实现键值对拆行
解决方案
问题原因
你之前使用的pd.json_normalize作用是将嵌套字典/JSON结构拆分为多列,每个字典键会生成单独的列,和你需要拆分为多行的需求不匹配;另外从你给出的样例数据看,keywords列存储的已经是原生Python字典对象,不是JSON格式字符串,不需要额外调用json.loads做转换。
实现代码
使用Pandas内置的explode方法即可完成字典键值对拆行,代码如下:
# 将每行的字典转换为(关键词, 权重)元组构成的列表 df["keywords"] = df["keywords"].apply(dict.items) # 按keywords列拆分多行,重置索引 df_long = df.explode("keywords", ignore_index=True) # 将元组拆分出独立的关键词、权重列 df_long[["keyword", "score"]] = pd.DataFrame( df_long["keywords"].tolist(), index=df_long.index ) # 清理冗余列得到最终结果 df_final = df_long.drop(columns=["keywords"])
输出效果
针对你给出的前2行样例数据,处理后结果结构如下:
| TopicID | keyword | score |
|---|---|---|
| 797 | licence | 0.529 |
| 797 | chapter | 0.462 |
| 797 | explains | 0.263 |
| 797 | visitor | 0.244 |
| 797 | resident | 0.220 |
| ... | ... | ... |
| 798 | emotional | 0.352 |
| 798 | mental | 0.327 |
| 798 | state | 0.309 |
如果后续遇到
keywords列存的是JSON字符串的情况,只需要在第一步前加一行df["keywords"] = df["keywords"].apply(json.loads)即可,当前你提供的样例不需要这步。
内容的提问来源于stack exchange,提问作者Usman Rafiq
相关产品推荐
相关产品推荐

