2017-09-25 51 views
0

我有一個包含某些列的數據框df。我正在嘗試做一些事情,而我得到一個奇怪的錯誤,而不是我期待的結果。在字典中應用lambda函數時出現鍵錯誤

我的想法是爲dataframe列的每個不同值生成一個數值,並將這對"real_value" : "numeric_value"添加到字典中。

全局字典,其中保存的結果是:

dict_res = {} 

我有一個功能是傳遞一個值和屬性名,獲取字典根據從全局字典「dict_res」的ATR,如果該值作爲字典中的鍵存在,返回其數值,如果不是,則生成一個新的數值,定義爲float(len(dict_res[atr]) + 1)

def indexMethod(value, atr): 
    global dict_res 
    res = float(len(dict_res[atr]) + 1) 
    if value in dict_res[atr]: 
     res = dict_res[atr][value] 
    else: 
     dict_res[atr][value] = res 
    return res 

在屬性下面的代碼片段遍歷我想生成一個數值,如果沒有創建到全局字典詞典相當於屬性「dict_res」創建它,然後用應用lambda函數是上面指定的方法。

for column in columns_to_index: 
    udf_func = UserDefinedFunction(lambda value: indexMethod(value, column), DoubleType()) 
    if(not column in dict_res): 
     dict_res[column] = {} 
    col2 = udf_func(df[column]) 
    df = df.withColumn('newCol', col2) 
    .... 

因此,我希望是產生與等價的字典,以及與那些同樣等價的新列在詞典中。

的過程之後,我打印字典如下:

print(dict_res) 

而結果我得到的是下一個:

{'ATR1': {}, 'ATR2': {}, ...} 

所以字典是空的。但最顯著的錯誤是,當我試圖表明數據框「DF」我得到了一個錯誤:

KeyError: 'ATR1' 

這怎麼可能,如果我有該鍵的字典?

希望你能幫助我...

回答

0

我不認爲你可以更新通過UDF,只有運行在行措施外Python對象(全局與否)。

另一種方式來解決這個問題是使用distinct()

dict_res = dict() 
for column in columns_to_index: 
    dict_res[column] = df.select(column).distinct().toPandas().to_dict() 
+0

時,我有一個數據幀,它不會被escaled更是有用的。但是,如果稍後我還要處理新數據,並且我想將結果與字典'dict_res'中已獲得的結果結合起來?無論如何,感謝您的迴應! – jartymcfly

+0

您可以使用'subtract',然後'distinct'並將新數據附加到現有字典中。 – MaFF

相關問題