You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中使用pandas apply生成向量时如何统计已处理文件数量?

实现累计处理计数的几个可行方案

方案1:最小修改的可变计数器方案

因为Python中不可变类型(int、str等)在嵌套作用域中不能直接修改,我们用可变的列表存储计数器,不需要改原有代码的整体结构:

  1. 调用apply前先初始化计数器和总数量:
    # 用单元素列表存储计数,利用可变对象可跨作用域修改的特性
    process_counter = [0]
    total_count = len(df)
    
  2. 修改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的原有逻辑:

  1. 安装依赖:pip install tqdm
  2. 替换原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:06:00