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

2024-05-13 18:02:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典(dic)和一个数据帧(df),df中的一列是dic中的键,一列是dic值的索引(类型:列表),我想在df中添加一列,它应该匹配dic和index的键值。你知道吗

输入测向:

    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

请更正它,代码应该尽可能有效地执行。你知道吗


Tags: 数据代码类型appledf列表index字典
3条回答

我会使用^{}^{}(考虑到字典名是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

您可以使用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

您可以从dataframe中的两列定义元组列表,并使用每个值对输入字典和内部列表进行索引:

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

相关问题 更多 >