Python/PySpark带条件通过for循环动态创建多个列表的问题咨询
报错原因
Python 不允许直接对字符串拼接这类运算表达式进行赋值操作,你代码中All_Items[n]+'_Base'是字符串计算结果,不属于合法的变量赋值对象,因此触发Cannot assign to operator报错。
额外注意:你手动编写的第一行代码中筛选条件为
clpd_rdm.Metric == 'Rwr',和常量列表All_Items里的'RWr'大小写不一致,注意按需核对避免筛选不到数据。
可行实现方案
方案1:字典存储结果(最推荐)
将所有生成的列表存入统一字典,不会污染全局变量空间,后续取值、调试都更方便:
base_dict = {} for item in All_Items: base_dict[f"{item}_Base"] = list(clpd_rdm.filter(clpd_rdm.Metric == item).select("Spp_value").distinct().toPandas()['Spp_value']) # 后续取值示例 print(base_dict['RWr_Base'])
方案2:动态生成全局变量
如果确实需要直接生成RWr_Base这类独立变量,可以操作globals()全局变量字典实现:
for item in All_Items: globals()[f"{item}_Base"] = list(clpd_rdm.filter(clpd_rdm.Metric == item).select("Spp_value").distinct().toPandas()['Spp_value']) # 后续可直接访问对应变量 print(RWr_Base)
方案3:性能优化版(适合大数据量场景)
如果clpd_rdm数据量较大,循环多次执行filter会重复扫描全量DataFrame,建议先按Metric分组聚合,一次计算得到所有结果:
from pyspark.sql.functions import collect_set # 一次分组计算所有Metric对应的去重Spp_value列表 grouped_df = clpd_rdm.groupBy("Metric").agg(collect_set("Spp_value").alias("distinct_spp")) result_map = {row["Metric"]: row["distinct_spp"] for row in grouped_df.collect()} # 存入字典 base_dict = {f"{k}_Base": v for k, v in result_map.items() if k in All_Items} # 或者生成全局变量 for k, v in result_map.items(): if k in All_Items: globals()[f"{k}_Base"] = v
该方案仅需扫描一次DataFrame,运行效率远高于循环filter。
内容的提问来源于stack exchange,提问作者Techie
相关产品推荐
相关产品推荐

