如何利用字典推导式将Pandas中键列表列与值列表列转换为字典列
解决Pandas中把行内列表对转为字典列的问题
你遇到的TypeError: unhashable type: 'list'是因为之前的写法搞错了操作层级——你试图把整个行的keys列表当作字典的键,把values列表当作对应的值,但列表是不可哈希的类型,不能作为字典的键,这才抛出了错误。
正确的实现方式
我们需要对每一行的keys和values列表分别进行zip操作,把对应位置的元素配对成字典的键值对,而不是把整个列表作为键值对。这里有两种简洁的实现方法:
方法1:使用列表推导式(推荐,速度更快)
df['dicts'] = [dict(zip(k_list, v_list)) for k_list, v_list in zip(df['keys'], df['values'])]
这个写法会遍历df['keys']和df['values']的每一对行元素,把每行的两个列表内部元素一一配对,再转成字典。
方法2:使用apply函数
df['dicts'] = df.apply(lambda row: dict(zip(row['keys'], row['values'])), axis=1)
apply会逐行处理数据,axis=1表示按行操作,每行的row['keys']和row['values']就是对应的两个列表,用zip配对后转成字典即可。
验证结果
运行上述代码后,你的DataFrame会生成预期的dicts列:
| keys | values | dicts | |
|---|---|---|---|
| 0 | ['key1','key2','key3'] | [0,1,2] | {'key1':0,'key2':1,'key3':2} |
| 1 | ['key1','key2','key3'] | [4,5,6] | {'key1':4,'key2':5,'key3':6} |
| 2 | ['key2','key1','key3'] | [7,3,6] | {'key2':7,'key1':3,'key3':6} |
为什么之前的写法失败?
回顾你尝试的两种写法:
{k:v for (k,v) in [x for x in zip(df['keys'], df['values'])]}:这里的k是每行的keys列表,v是values列表,你试图把列表作为字典的键,而列表不可哈希,所以报错。dict(zip(df['keys'], df['values'])):同样的问题,zip(df['keys'], df['values'])生成的是(keys列表, values列表)这样的元组,dict()会把每个keys列表当作键,这显然不符合你的需求,也会触发同样的错误。
内容的提问来源于stack exchange,提问作者Eoin Dowling
相关产品推荐
相关产品推荐

