Vaex拼接DataFrame时Lambda函数报错的解决方法咨询
解决Vaex拼接DataFrame时lambda函数不兼容的问题
问题原因
Vaex在拼接DataFrame时,会检查衍生列的函数是否一致。你循环中每次创建的lambda都是独立的函数实例,哪怕逻辑完全相同,Vaex也会判定为不同的函数,因此抛出Unequal function lambda_function的错误。
解决方法
方法1:用具名函数替代lambda
把匿名lambda换成定义好的普通函数,这样所有DataFrame使用的是同一个函数对象,拼接时就不会出现函数不一致的冲突:
import os import re import tarfile import io import vaex def get_years_files(num_years): files = os.listdir("myfiles") # 筛选符合年份要求的文件(修正原函数返回值不匹配的问题) filtered_files = [file for file in files if int(re.findall('\d+', file)[0]) <= num_years] return filtered_files # 定义具名函数替代lambda def extract_wmo(station): return str(station)[:-5] def process(yearfiles): lst = [] for yearfile in yearfiles: tar = tarfile.open("myfiles/" + yearfile, "r") for member in tar: if ".csv" in member.name: vx = vaex.from_csv(io.BytesIO(tar.extractfile(member).read())) # 使用统一的具名函数生成新列 vx['WMO'] = vx['STATION'].apply(extract_wmo) lst.append(vx) tar.close() df_vx = vaex.concat(lst) return df_vx
方法2:先拼接所有DataFrame,再统一添加新列
避免在每个小DataFrame上单独生成衍生列,先完成所有原始数据的拼接,再一次性添加WMO列,从根源上避免函数不一致的问题:
import os import re import tarfile import io import vaex def get_years_files(num_years): files = os.listdir("myfiles") filtered_files = [file for file in files if int(re.findall('\d+', file)[0]) <= num_years] return filtered_files def process(yearfiles): lst = [] for yearfile in yearfiles: tar = tarfile.open("myfiles/" + yearfile, "r") for member in tar: if ".csv" in member.name: vx = vaex.from_csv(io.BytesIO(tar.extractfile(member).read())) # 只收集原始DataFrame,暂不添加新列 lst.append(vx) tar.close() df_vx = vaex.concat(lst) # 拼接完成后统一生成新列 df_vx['WMO'] = df_vx['STATION'].apply(lambda x: str(x)[:-5]) return df_vx
额外说明
- 原
get_years_files函数返回的是年份数字列表,而process需要的是文件名,因此上面的代码修正了这个逻辑,确保传入process的是正确的文件名称,你可以根据实际调用需求调整。 - 方法2的执行效率更高,因为只需要执行一次列生成操作,而非每个小文件都重复执行。
内容的提问来源于stack exchange,提问作者HMadadi
相关产品推荐
相关产品推荐

