如何通过索引选择字典的值并通过键将其放入数据帧?

时间:2019-07-16 14:30:26

标签: python pandas dataframe dictionary object

我有一个字典(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

请更正它,并应尽可能高效地执行代码。

3 个答案:

答案 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)

我将使用maplookup(考虑到您可以使用的字典名称为d

df['D']=pd.DataFrame(df.A.map(d).values.tolist(),
                   index=df.index).lookup(df.C.index,df.C.values)
print(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