如何将数千个Pandas DataFrame合并为一个Vaex DataFrame?
合并数千个Pandas DataFrame为Vaex DataFrame的正确方法
你的两次尝试都存在合并方式的错误:
- 首次错误:Vaex的
concat是顶层工具函数(需调用vaex.concat()),并非Vaex DataFrame实例的方法,所以df_vaex.concat(df_vx)会触发属性错误。 - 二次错误:你用Pandas的
pd.concat()去合并Vaex DataFrame,两个库的数据对象不兼容,必然报错。
下面提供三种可行的实现方案,根据你的内存情况选择:
方案1:批量收集后一次性合并(推荐,效率最高)
先将所有转换后的Vaex DataFrame存入列表,最后一次性合并,避免循环中重复合并的性能损耗:
import vaex import pandas as pd vaex_dfs = [] for idx, file in enumerate(files): # 读取pickle为Pandas DataFrame pd_df = pd.read_pickle(file) # 转换为Vaex DataFrame vx_df = vaex.from_pandas(pd_df, copy_index=False) vaex_dfs.append(vx_df) if idx % 100 == 0: print(f"已处理 {idx} 个文件") # 合并所有Vaex DataFrame final_vaex_df = vaex.concat(vaex_dfs)
方案2:循环逐步合并(低内存场景适用)
如果内存不足以存储所有Vaex DataFrame,可以每次合并后更新总DataFrame,但注意必须用vaex.concat()重新赋值:
import vaex import pandas as pd final_vaex_df = None for idx, file in enumerate(files): pd_df = pd.read_pickle(file) vx_df = vaex.from_pandas(pd_df, copy_index=False) if final_vaex_df is None: final_vaex_df = vx_df else: # 用Vaex的concat合并并重新赋值 final_vaex_df = vaex.concat([final_vaex_df, vx_df]) if idx % 100 == 0: print(f"已处理 {idx} 个文件")
方案3:先转存为Vaex格式再内存映射合并(超大数据量场景)
如果文件数量极大,内存压力过高,可以先将每个Pandas DataFrame转存为Vaex支持的格式(如HDF5、Arrow),再通过内存映射批量读取合并,无需加载全部数据到内存:
import vaex import pandas as pd import os # 创建临时目录存储转换后的文件 temp_dir = "./vaex_temp_files" os.makedirs(temp_dir, exist_ok=True) # 批量转换并保存 for idx, file in enumerate(files): pd_df = pd.read_pickle(file) vx_df = vaex.from_pandas(pd_df, copy_index=False) temp_file = os.path.join(temp_dir, f"chunk_{idx}.hdf5") vx_df.export(temp_file) if idx % 100 == 0: print(f"已转存 {idx} 个文件") # 内存映射读取并合并所有文件 final_vaex_df = vaex.open(os.path.join(temp_dir, "chunk_*.hdf5"))
注意事项
- 确保所有源Pandas DataFrame的列名、数据类型完全一致,否则合并会出现列不匹配的错误。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

