You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用DataFrame两列作字典键取值遇TypeError,求生成序列新列方案

问题描述

使用Python处理DataFrame时,尝试将两列作为键从字典中取值填充新列,触发TypeError: unhashable type: 'Series'错误。

字典格式:

dictionary = {tuple: list}

键集合示例:

dict_keys([('102304', '15311'), ('102304', '919967')])

错误代码:

df['newcol']=dictionary.get( ( [ df['x'],df['y'] ] ) ) 

最终目标:根据字典中(x,y)键对应的列表,将列表元素逐行填充到新列,示例如下:

字典示例:

dic = {('111','112'):[2,3,4,5,6,7,8], ('1','2'):[2,33,4,5]}

期望DataFrame结果:

xynewcol
1111122
1111123
1111124
1111125
122
1233
错误原因

代码中[df['x'], df['y']]生成的是两个Series组成的列表,列表和Series都是不可哈希类型,无法匹配字典中作为键的tuple(可哈希),因此触发unhashable type错误。

解决方案

步骤1:为每行匹配字典中的列表

使用df.apply逐行将x和y组合成tuple,作为键从字典中获取对应列表:

import pandas as pd

# 示例原DataFrame
df = pd.DataFrame({'x': ['111', '1'], 'y': ['112', '2']})
dic = {('111','112'):[2,3,4,5,6,7,8], ('1','2'):[2,33,4,5]}

# 添加存储列表的列
df['list_col'] = df.apply(lambda row: dic.get((row['x'], row['y']), []), axis=1)

步骤2:将列表展开为多行

使用explode方法将列表列拆分为独立行,并重命名为目标列名:

df_result = df.explode('list_col').rename(columns={'list_col': 'newcol'})

执行后即可得到期望的DataFrame结果。


内容的提问来源于stack exchange,提问作者FRE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:05:56