尝试使用两列作为键从字典中获取值: TypeError: unhashable type: 'Series'

trying to use two column as key to get value from a dict: TypeError: unhashable type: 'Series'

提问人:FRE 提问时间:10/20/2023 最后编辑:mozwayFRE 更新时间:10/20/2023 访问量:38

问:

这是我的字典格式:

dictionary = {tuple:list}

使用这些密钥

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

我正在尝试用此行填充 DataFrame 中的列

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

 TypeError: unhashable type: 'Series'

我试图在该系列中投射其他类型的类型,但没有奏效。

我的最终目标是用字典中列表的“序列”填充新列:

dic = {('111','112'):[2,3,4,5,6,7,8], ('1','2'):[2,33,4,5]}
x y 纽科尔
111 112 2
111 112 3
111 112 4
111 112 5
1 2 2
1 2 33
Python Pandas DataFrame 系列

评论

0赞 mozway 10/20/2023
使用或mapmerge
0赞 mozway 10/20/2023
你能提供一个可重复的输入吗?df

答:

1赞 mozway 10/20/2023 #1

您可以在将字典转换为 Series 后进行合并,然后分解生成的列:

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

out = (df.merge(pd.Series(dic, name='newcol'),
                left_on=['x', 'y'], right_index=True, how='left')
         .explode('newcol')
      )

输出:

     x    y newcol
0  111  112      2
0  111  112      3
0  111  112      4
0  111  112      5
0  111  112      6
0  111  112      7
0  111  112      8
1    1    2      2
1    1    2     33
1    1    2      4
1    1    2      5

如果输入 DataFrame 已经有几行重复的行,并且您希望按顺序合并,请先合并 Series,然后在使用 groupby.cumcount 进行重复数据删除后:explodemerge

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

out = (df
   .assign(n=lambda d: d.groupby(['x', 'y']).cumcount())
   .merge(pd.Series(dic, name='newcol').rename_axis(['x', 'y'])
            .explode().to_frame()
            .assign(n=lambda d: d.groupby(['x', 'y']).cumcount()),
          on=['x', 'y', 'n'], how='left')
  .drop(columns='n')
 )

输出:

     x    y newcol
0  111  112      2
1  111  112      3
2  111  112      4
3  111  112      5
4    1    2      2
5    1    2     33

评论

1赞 FRE 10/20/2023
我通过在字典和 df['newcol'] = df.apply(lambda row: next(dict.get((row['x'], row['y']))), axis=1) 的值中使用迭代器列表来解决它,但您的解决方案比我的解决方案出色得多。非常感谢您的帮助。
1赞 mozway 10/20/2023
@FRE 不客气。那么你有哪个案例?我猜第二个?您能否用可重复的代码更新问题?这将对未来的读者有所帮助。df