
本文介绍如何将 DataFrame 中存储为字符串的多语言列表(如 ['English','Japanese'])安全解析为 Python 列表,并按每个语言项反向映射到对应图书,最终构建“语言 → 图书列表(单个时为字符串,多个时为列表)”的嵌套字典结构。
本文介绍如何将 dataframe 中存储为字符串的多语言列表(如 `['english','japanese']`)安全解析为 python 列表,并按每个语言项反向映射到对应图书,最终构建“语言 → 图书列表(单个时为字符串,多个时为列表)”的嵌套字典结构。
在实际数据处理中,常遇到 CSV 导入后数组字段被读作字符串(如 "['English','Japanese']")的情况。直接对这类列使用 groupby 无法生效,因为 pandas 不会自动展开嵌套结构。核心思路是:先安全解析字符串为真实列表,再逐行展开(explode)语言项,最后聚合映射关系。
推荐采用 pandas 原生链式操作,兼顾可读性与性能(优于显式 for 循环):
import pandas as pd
import ast
# 示例数据
df = pd.DataFrame({
"Book Name": ["Book 1", "Book 2", "Book 3"],
"Languages": ["['Portuguese','English']", "['English','Japanese']", "['Spanish','Italian','English']"]
})
# 步骤1:安全解析字符串为列表(ast.literal_eval 比 eval() 更安全)
df["Languages"] = df["Languages"].apply(ast.literal_eval)
# 步骤2:使用 explode 展开数组列——每条记录按语言项拆分为多行
exploded = df.explode("Languages")
# 步骤3:按 Language 分组,聚合 Book Name 为 list;再统一处理单元素情况
result_series = exploded.groupby("Languages")["Book Name"].apply(list)
# 步骤4:转换为所需格式:单元素保留字符串,多元素保留列表
language_dict = {
lang: books[0] if len(books) == 1 else books
for lang, books in result_series.items()
}
print(language_dict)
输出:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
{
'Portuguese': 'Book 1',
'English': ['Book 1', 'Book 2', 'Book 3'],
'Japanese': 'Book 2',
'Spanish': 'Book 3',
'Italian': 'Book 3'
}
⚠️ 注意事项:
-
永远避免使用
eval()解析字符串数组,它可能执行任意代码,存在严重安全隐患;务必使用ast.literal_eval()。 - 若原始 CSV 中存在空值(
NaN)或格式异常的字符串(如缺失引号),ast.literal_eval()会抛出ValueError,建议添加异常处理或预清洗:df["Languages"] = df["Languages"].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) and x.strip() else [])
-
explode()要求列中元素为可迭代对象(如list,tuple),若含None或非迭代类型需提前填充(如用空列表[]替代)。
该方法逻辑清晰、可扩展性强,适用于任意“一对多”字段的反向索引构建场景,如标签分类、技能匹配、多选属性统计等。










