我有一些包含一些列的数据框df
。我正在尝试做某事我得到一个奇怪的错误,而不是我期待的结果。
我的想法是为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 :(得分:0)
我认为你不能通过仅在行上操作的UDF
来更新外部python对象(全局或非全局)。
解决问题的另一种方法是使用distinct()
:
dict_res = dict()
for column in columns_to_index:
dict_res[column] = df.select(column).distinct().toPandas().to_dict()