Azure Databricks Gen2中修改Pandas DataFrame列值报错求助
解决Azure Databricks Gen2中Pandas DataFrame条件赋值报错问题
问题根源
Azure Databricks Gen2默认使用的**PySpark Pandas(原Koalas)**是适配Spark分布式环境的Pandas API,它的Series并非本地Pandas的内存对象,而是基于Spark RDD的封装。这导致:
- 直接用
np.where操作时,NumPy需要调用Series的__iter__方法遍历数据,但PySpark Pandas禁用了该方法,抛出PandasNotImplementedError。 - 强制转
to_numpy()后,混合NumPy数组和PySpark Pandas Series赋值时,Spark内部需要_internal元数据管理分布式数据,而NumPy数组无此属性,触发AttributeError。
解决方案
方案1:使用PySpark Pandas原生条件赋值(推荐,适配分布式数据)
用PySpark Pandas自带的Series.where()方法替代np.where,逻辑与np.where相反,无需转换为NumPy数组:
data_2['col1'] = data_2['col1'].where( ~((df1['year'].astype(int) == 2021) & df1['col1_y'].notna()), df1['col1_y'] )
- 逻辑说明:当
~(条件)为真时,保留data_2['col1']的原值;当条件为真时,替换为df1['col1_y']的值,和原np.where逻辑完全一致。
方案2:转换为本地Pandas处理(仅适用于小数据集)
如果数据量较小,可将Spark-backed的DataFrame转为本地Pandas对象,再用原代码操作:
# 转换为本地Pandas DataFrame df1_local = df1.toPandas() data_2_local = data_2.toPandas() # 执行原逻辑 data_2_local['col1'] = np.where( (df1_local.year.astype(int) == 2021) & df1_local.col1_y.notna(), df1_local.col1_y, data_2_local.col1 ) # 若需写回Spark,再转换回去 data_2 = spark.createDataFrame(data_2_local)
注意:大数据量下toPandas()会将数据拉取到Driver节点,可能导致内存溢出,不推荐使用。
内容的提问来源于stack exchange,提问作者DigiLearner
相关产品推荐
相关产品推荐

