Python中使用pandas apply生成向量时如何统计已处理文件数量?
实现累计处理计数的几个可行方案
方案1:最小修改的可变计数器方案
因为Python中不可变类型(int、str等)在嵌套作用域中不能直接修改,我们用可变的列表存储计数器,不需要改原有代码的整体结构:
- 调用
apply前先初始化计数器和总数量:# 用单元素列表存储计数,利用可变对象可跨作用域修改的特性 process_counter = [0] total_count = len(df) - 修改
getVector函数,添加计数打印逻辑:def getVector(model, file): # 原有处理逻辑保留 vector = model.predict(inp.reshape(1, 100, 100, 1)) # 计数累加 process_counter[0] += 1 # 按需打印,不需要格式直接print(process_counter[0])即可 print(f"{process_counter[0]} out of {total_count:,} is processed") return vector
如果觉得100万条每次打印拖慢速度,可以加间隔打印逻辑,比如每处理1000条打一次:
if process_counter[0] % 1000 == 0: print(process_counter[0])
方案2:进度条工具方案(更直观)
如果需要同时看处理速度、剩余时间,直接用tqdm库封装pandas的apply方法即可,不需要修改getVector的原有逻辑:
- 安装依赖:
pip install tqdm - 替换原有
apply逻辑:from tqdm import tqdm # 注册pandas进度条扩展 tqdm.pandas() df['file'] = files # 用progress_apply替代apply即可 df['features'] = df.progress_apply(lambda row: getVector(model, row['file']), axis=1)
运行时会自动输出带计数、速度、剩余时间的进度条。
方案3:无全局变量方案
如果不想污染全局命名空间,可以用闭包+nonlocal关键字实现计数:
def process_with_counter(model, df): counter = 0 total = len(df) # 把getVector定义为内部函数 def getVector(file): nonlocal counter # 原有处理逻辑保留 vector = model.predict(inp.reshape(1, 100, 100, 1)) counter += 1 print(counter) return vector df['features'] = df.apply(lambda row: getVector(row['file']), axis=1) return df
直接调用process_with_counter(model, df)即可完成处理和计数。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

