Pandas风格loc赋值操作在Dask中的替代实现方案咨询
解决方案
Dask确实不支持直接通过.loc做原地赋值操作,以下两种实现方式都可以实现你要的逻辑,最终返回完整Dask DataFrame:
方式1:使用mask方法(写法更简洁,推荐新手使用)
不需要嵌套循环,直接通过isin构造判断条件,批量对目标列做条件替换即可:
# 构造判断条件:any_column_in_df的值属于columns_2的行 condition = df['any_column_in_df'].isin(columns_2) # 对columns_1中的所有列做条件赋值:符合条件的位置替换为0 for col in columns_1: df[col] = df[col].mask(condition, 0)
上述操作都是惰性计算,不会修改原数据,执行完成后你得到的df就是完整结构的Dask DataFrame,后续按需调用.compute()即可拿到计算结果。
方式2:沿用你熟悉的map_partitions方案(和Pandas原生逻辑完全兼容)
map_partitions处理的每个分区都是普通Pandas DataFrame,完全支持你原有的loc赋值逻辑,直接把Pandas代码搬到分区处理函数里即可:
import pandas as pd def assign_zero_by_condition(partition: pd.DataFrame) -> pd.DataFrame: # 直接复用你原来的Pandas条件赋值逻辑 for col1 in columns_1: for col2 in columns_2: partition.loc[partition['any_column_in_df'] == col2, col1] = 0 return partition # 避免Dask自动推断返回结构出错,可以主动指定meta和原df结构一致 df = df.map_partitions(assign_zero_by_condition, meta=df._meta)
内容的提问来源于stack exchange,提问作者Sunil Varma
相关产品推荐
相关产品推荐

