尝试使用两列作为键从字典中获取值:TypeError:不可散列类型:'Series'

问题描述 投票:0回答:1

这是我的字典格式:

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 series
1个回答
1
投票

您可以

merge
将字典转换为系列后,然后
explode
结果列:

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 已经有多个重复行,并且您想按顺序合并,请先

explode
系列,然后使用
merge
 去重后 
groupby.cumcount

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
© www.soinside.com 2019 - 2024. All rights reserved.