如何将Pandas中带方括号的字符串列转为以列表为键的字典?
解决方案
首先明确两个关键点:
- 你用
ast.literal_eval转换列的思路是对的,但需要正确提取单个行的数值,而非直接对整列调用tolist() - Python中列表不能作为字典的键(列表是可变类型,不可哈希),所以你期望的
{['1', '2', '3']:['A', 'B']}在Python中无法创建,会抛出TypeError: unhashable type: 'list'错误,建议用元组(不可变、可哈希)替代列表作为键。
具体实现步骤
- 导入依赖库并构造示例DataFrame
import pandas as pd import ast # 构造你的样本DataFrame df = pd.DataFrame({ 'name': ["['A', 'B']"], 'items': ["['1', '2', '3']"] })
- 将字符串格式的"列表"转换为实际的Python列表
# 对name和items列分别应用ast.literal_eval df['name'] = df['name'].apply(ast.literal_eval) df['items'] = df['items'].apply(ast.literal_eval)
- 创建目标字典(用元组作为键)
如果你的DataFrame只有一行数据,可直接提取单个元素:
# 获取转换后的列表 name_list = df['name'].iloc[0] items_tuple = tuple(df['items'].iloc[0]) # 生成字典 dict1 = {items_tuple: name_list}
如果DataFrame有多行数据,用迭代方式生成:
dict1 = {} for _, row in df.iterrows(): dict1[tuple(row['items'])] = row['name']
关于你之前的疑惑
调用df['name'].tolist()得到[['A', 'B']]是因为tolist()会把整个列的所有元素打包成一个列表,而你的列中只有一个元素(即['A','B']这个列表),所以结果是嵌套列表。要获取单个行的列表值,用iloc[0](取第一行)或者iat[0]即可。
内容的提问来源于stack exchange,提问作者John Taylor
相关产品推荐
相关产品推荐

