这是我的字典格式:
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 |
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