提问人:FRE 提问时间:10/20/2023 最后编辑:mozwayFRE 更新时间:10/20/2023 访问量:38
尝试使用两列作为键从字典中获取值: TypeError: unhashable type: 'Series'
trying to use two column as key to get value from a dict: TypeError: unhashable type: 'Series'
问:
这是我的字典格式:
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 |
答:
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
进行重复数据删除后:explode
merge
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
评论
map
merge
df