如何用Dask替代Pandas?现有Pandas代码求转换方案
用Dask替代Pandas实现你的Excel处理逻辑
以下是对应原Pandas代码的Dask实现,同时标注关键差异点:
import dask.dataframe as dd import pandas as pd newfilename = "test.xlsx" cols = ['A', 'B', 'C', 'D'] # 1. 用Dask读取Excel(依赖openpyxl/xlrd,与Pandas一致) dask_df = dd.read_excel( "old_test.xlsx", header=1, names=cols, usecols=cols, converters={'A': int, 'B': int, 'C': int}, engine="openpyxl" # 显式指定引擎,避免版本兼容问题 ) # 2. 提取全空行的索引(Dask需先compute拿到本地数据) full_null_rows = dask_df[dask_df.isnull().all(axis=1)].index.compute() # 3. 拆分Dask DataFrame为多个子数据集 dask_df_list = [] prev_idx = 0 for idx in full_null_rows: sub_df = dask_df.loc[prev_idx:idx-1] dask_df_list.append(sub_df) prev_idx = idx + 1 # 补充最后一段未被拆分的数据 if prev_idx < len(dask_df): dask_df_list.append(dask_df.loc[prev_idx:]) # 4. 处理每个子数据集:去全空行 + 分组聚合 processed_dfs = [] for sub_df in dask_df_list: # 移除全空行 cleaned_sub = sub_df.dropna(how='all') # 分组聚合:必须指定meta声明返回结构 aggregated = cleaned_sub.groupby(['A', 'B', 'D'])['C'].apply( lambda x: ','.join(map(str, x)), meta=('C', 'object') ).reset_index() # 重新排列列顺序 reordered = aggregated[['A', 'B', 'C', 'D']] processed_dfs.append(reordered) # 5. 写入多Sheet Excel(Dask无原生多Sheet支持,转Pandas处理) with pd.ExcelWriter(newfilename, engine="xlsxwriter") as writer: for i, ddf in enumerate(processed_dfs): pdf = ddf.compute() pdf.to_excel(writer, sheet_name=f'Sheet{i}', index=False)
关键差异说明
- 读取阶段:Dask的
dd.read_excel参数与Pandas基本对齐,但建议显式指定引擎(如openpyxl),避免环境依赖导致的兼容问题。 - 全空行索引获取:Dask采用延迟计算模式,必须调用
.compute()将全空行索引转为本地列表后,才能进行DataFrame拆分。 - 分组聚合:Dask的
groupby.apply必须传入meta参数,明确声明聚合后返回列的名称与数据类型,否则无法完成延迟计算的任务调度。 - 多Sheet写入:Dask暂无原生多Sheet写入Excel的支持,需将每个Dask DataFrame通过
.compute()转为Pandas DataFrame后,再借助Pandas的ExcelWriter完成写入。
注意事项
- 若处理超大型Excel文件,可通过调整Dask的
blocksize参数控制分区大小,避免内存溢出。 - 确保安装所需依赖:
pip install dask[complete] openpyxl xlsxwriter
内容的提问来源于stack exchange,提问作者Mackyui
相关产品推荐
相关产品推荐

