Python遍历目录处理数据报错:__array_function__调度器未返回可迭代对象
问题修复方案
报错核心原因
你触发报错的直接问题是np.concatenate的调用参数完全不符合要求:
np.concatenate第一个参数必须是待拼接的数组组成的可迭代序列,你写的np.concatenate((False),a[1:] > a[:-1])把两个拆分对象分别传成了第一、第二个参数,且(False)是布尔标量不是数组,也不是合法的单元素元组(单元素元组需要加末尾逗号写成(False,))。
除此之外你的代码还有多处逻辑错误,导致批量处理完全无法正常运行:
os.chdir()的返回值为None,你将其赋值给directory后调用os.listdir(directory)属于逻辑漏洞- 循环内没有读取文件的逻辑,
df变量未定义或始终复用全局变量,无法逐个处理目录下的文件 - 将
rise函数定义放在循环内,属于不必要的重复定义,会拖低运行效率
修复后的代码
方案1:修复原有的numpy实现逻辑
import os import pandas as pd import numpy as np # 路径处理 dir_path = r"你的目标目录路径" dir_list = os.listdir(dir_path) # 把函数定义移到循环外 def rise(a): # 第一个参数传数组组成的元组,False转为长度为1的布尔数组 return np.concatenate((np.array([False]), a[1:] > a[:-1])) for file in dir_list: # 补全文件读取逻辑,根据你的文件格式调整读取函数,比如csv用read_csv,xlsx用read_excel file_full_path = os.path.join(dir_path, file) df = pd.read_csv(file_full_path) df['flag_rise'] = rise(df.Zoom.values) # 补全保存逻辑,根据你的需求调整输出路径和格式 df.to_csv(file_full_path, index=False)
方案2:用pandas原生方法实现,更简洁不易出错
不用单独封装numpy函数,直接用pandas的shift方法对比前一行值,代码更易读:
import os import pandas as pd dir_path = r"你的目标目录路径" dir_list = os.listdir(dir_path) for file in dir_list: file_full_path = os.path.join(dir_path, file) df = pd.read_csv(file_full_path) # shift(1)会把列值整体向下挪一行,第一行没有前值默认返回NaN,和NaN比较结果为False,刚好符合需求 df['flag_rise'] = df['Zoom'] > df['Zoom'].shift(1) df.to_csv(file_full_path, index=False)
内容的提问来源于stack exchange,提问作者KateP
相关产品推荐
相关产品推荐

