我有一个字典(dic)和一个数据框(df),df中的一列是dic中的键,一列是dic的值的索引(类型:list),我想在df中添加一列并且它应该匹配dic和index的键值。
输入df:
A B C
1 a ` 0
2 b @ 1
3 a # 1
4 c ¥ 0
5 b % 2
输入dic:
{'a': ['apple', 'append'], 'b': ['boy', 'baby', 'bus'], 'c': ['cow', 'code'], 'd': ['dog', 'dislike']}
目标df:
A B C D
1 a ` 0 apple
2 b @ 1 baby
3 a # 1 append
4 c ¥ 0 cow
5 b % 2 bus
这是我当前的代码:
df['D'] = dic[df['A']][df['C']]
错误:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
请更正它,并应尽可能高效地执行代码。
答案 0 :(得分:3)
您可以在数据框的两列中定义一个元组列表,并使用每个值对输入字典和内部列表进行索引:
d_ = tuple(zip(df['A'], df['C']))
# (('a', 0), ('b', 1), ('a', 1), ('c', 0), ('b', 2))
df['D'] = [d[a][c] for a,c in d_]
A B C D
1 a ` 0 apple
2 b @ 1 baby
3 a # 1 append
4 c ¥ 0 cow
5 b % 2 bus
答案 1 :(得分:1)
您可以使用merge
并将输入字典转换为数据框:
dd = {'a': ['apple', 'append'],
'b': ['boy', 'baby', 'bus'],
'c': ['cow', 'code'],
'd': ['dog', 'dislike']}
df_dd = pd.DataFrame.from_dict(dd, orient='index')
df.merge(df_dd.stack().rename('D').reset_index(),
left_on=['A', 'C'],
right_on=['level_0','level_1'])[['A','B','C','D']]
输出:
A B C D
0 a ` 0 apple
1 b @ 1 baby
2 a # 1 append
3 c ¥ 0 cow
4 b % 2 bus
答案 2 :(得分:1)