使用Dask合并Excel文件报错:无法合并列表类型对象的问题排查
代码错误分析与修正方案
错误原因
你遇到的报错核心是dask.compute(delayeds)的返回值类型不符合pd.concat的要求:
delayeds是延迟对象的列表,dask.compute接收该列表后,会返回一个包含列表的元组(格式类似([df1, df2, ...],))- 当你把这个元组传给
pd.concat时,它会尝试合并元组内的列表对象,但pd.concat仅支持Series或DataFrame类型的可迭代对象,因此触发类型错误。
修正方案
方案1:修正compute结果的处理逻辑
有两种方式提取出正确的DataFrame集合:
- 方式A:解包延迟对象列表给
dask.compute,直接得到由DataFrame组成的元组 - 方式B:从compute返回的元组中提取出DataFrame列表
修正后的代码示例:
import pandas as pd import glob import dask files = glob.glob(r"D:\XX\XX\XX\XX\XXX\*.xlsx") delayeds = [dask.delayed(pd.read_excel)(i, skiprows=0) for i in files] # 方式A:解包延迟对象 results = dask.compute(*delayeds) df = pd.concat(results, ignore_index=True) # 方式B:提取元组中的列表 # results, = dask.compute(delayeds) # df = pd.concat(results, ignore_index=True)
方案2:更适配场景的Dask DataFrame用法(推荐)
既然你用Dask是为了应对后续增长的文件数量,更推荐直接使用Dask DataFrame的原生API,它会自动处理多文件合并,且无需一次性将所有数据加载到内存:
import dask.dataframe as dd import glob files = glob.glob(r"D:\XX\XX\XX\XX\XXX\*.xlsx") # 读取所有Excel文件并自动合并为Dask DataFrame ddf = dd.read_excel(files, skiprows=0) # 若需要转为Pandas DataFrame(数据量在内存可承受范围内时执行) df = ddf.compute()
内容的提问来源于stack exchange,提问作者user17743486
相关产品推荐
相关产品推荐

