使用嵌套字典作为数据框的查找表时返回错误

时间:2019-05-15 18:48:26

标签: python pandas dictionary

我有一个嵌套的字典,该字典用作查找表以将值分配给数据框字段。 该代码在运行时返回以下错误:

TypeError :(““系列”对象是可变的,因此无法进行散列”,“发生在索引0”)

我尝试使用get()函数,但收到相同的错误消息。

字典:

for (var jsonElement in jsonData) {
  _events
      .putIfAbsent(
        DateTime.parse(jsonElement['tanggal']),
        () => [],
      )
      .add(jsonElement['acara']);
}

在字典中查找值的代码,第一个字典值使用硬编码值,第二个字典值使用数据帧结构中的值。 它将从嵌套字典中检索到的值(使用数据框中行的Year值)保存为数据框的行,作为名为AdjustedResult的变量。

AdjFact= {
        'Good':
            {0: 0, 2010: 2.566, 2011: 1.77, 2012: 0.9658515212},
        'Bad':
            {0: 0, 2010: 3.222, 2011: 1.0423, 2012: 0.3534},
        'Avg':
            {0: 0, 2010: 1.30, 2011: 4.2, 2012: 1.01}
            }

如果可以使用其他查找表(数据框等),则我不必特别使用AdjFact词典。

编辑:下面添加了代码-仅用于测试目的

我在下面硬编码了很多值和伪数据帧,只是为了可以测试代码的逻辑(即查找功能)

def lookup(row,lval):


    df= df_dict[[row['A'],row['B']]

    df['AdjustedResult'] = AdjFact[lval][df['Year']]


    . . . . . . . (more code deleted)
    return Total, Diff

newdf[['TotalGood' , 'DiffGood']] = newdf.apply(lookup, lval='Good', axis=1).apply(pd.Series)
newdf[['TotalBad' , 'DiffBad']] = newdf.apply(lookup, lval='Bad', axis=1).apply(pd.Series)
newdf[['TotalAvg' , 'DiffAvg']] = newdf.apply(lookup, lval='Avg', axis=1).apply(pd.Series)


1 个答案:

答案 0 :(得分:1)

df['Year']是一个系列(不能被散列,因此您不能在字典中查找它)。我怀疑您是说row['Year'],该行的年份?

也就是说,

df['AdjustedResult'] = AdjFact[lval][df['Year']]

应为:

df['AdjustedResult'] = AdjFact[lval][row['Year']]

-

更新:在您的最新示例中,您似乎想要查找每一行的值(我在第一个示例中错过了它):

ipdb> m_df['Year'].map(AdjFact[lval])
0    0.000
1    0.000
2    2.566
3    2.566
4    1.770
Name: Year, dtype: float64

因此您应该使用:

m_df['AdjustedResult'] = m_df['Year'].map(AdjFact[lval])