PySpark DataFrame转Python列表后如何访问名称不固定的动态列
报错原因
你写的s3_list[0].j.Month是尝试访问Row对象中名为j的属性下的Month子属性,而不是读取j.Month变量存储的动态列名字符串,因此会触发属性不存在的报错。
正确访问方法
PySpark的Row对象支持两种动态访问不定名字段的方式:
方法1:字典下标访问(最简洁)
直接把存储列名的变量放在方括号内即可,修正后代码如下:
for i in uniqueProduct_list: s3_df = channel_Result_8_df.filter((f.col("product") == i.product) & (f.col("S") == 3)) s3_list = s3_df.rdd.map(lambda x: x).collect() for j in month_list: # 传入j.Month存储的列名字符串访问对应字段 print(s3_list[0][j.Month]) break break
方法2:先转字典再访问(适合批量处理字段场景)
先调用Row对象的asDict()方法转为普通Python字典,再用动态键访问:
for i in uniqueProduct_list: s3_df = channel_Result_8_df.filter((f.col("product") == i.product) & (f.col("S") == 3)) s3_list = s3_df.rdd.map(lambda x: x).collect() # 转为字典 row_dict = s3_list[0].asDict() for j in month_list: print(row_dict[j.Month]) break break
注意事项
确保j.Month返回的字符串和DataFrame中的列名完全一致,无大小写、空格差异,避免出现KeyError。
内容的提问来源于stack exchange,提问作者Pardeep Naik
相关产品推荐
相关产品推荐

