用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结果:
| x | y | newcol |
|---|---|---|
| 111 | 112 | 2 |
| 111 | 112 | 3 |
| 111 | 112 | 4 |
| 111 | 112 | 5 |
| 1 | 2 | 2 |
| 1 | 2 | 33 |
错误原因
代码中[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
相关产品推荐
相关产品推荐

