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

Pandas中DataFrame值替换操作耗时过长的问题求助

解决pandas函数中某行代码耗时过长的问题

问题背景

我编写了一个concatenate_fields函数,移除df.loc[df['ln_1_adr'] == df['ln_2_adr'], df['ln_1_adr']] = ''这一行时,函数仅需毫秒级即可运行。但这行代码是用来清除地址第一行的冗余信息的,偏偏它运行耗时极长,传入函数的是一个3000行8列的DataFrame。

原函数代码如下:

import pandas as pd

def concatenate_fields(df):
    df = pd.DataFrame(df).copy()
    for col in ['ln_1_adr','ln_2_adr','city_adr', 'state_adr', 'zip_5_adr','zip_4_adr']:
        df[col] = df[col].str.strip()
        if col in ('ln_1_adr','ln_2_adr'):
            df[col] = df[col].str.replace(r"-", " ", regex=False)
    df.loc[df['ln_1_adr'] == df['ln_2_adr'], df['ln_1_adr']] = '' # 这行代码耗时极长
    df["zip_plus_4"] = df.zip_5_adr.str.cat(df['zip_4_adr'], sep=' ', na_rep='')
    df["ADDRESS"] = df.ln_1_adr.str.cat(df[['ln_2_adr','city_adr', 'state_adr', 'zip_plus_4']], sep = ' ', na_rep='').str.strip()
                                            
    return df

优化方案

原代码中耗时的那行问题在于:使用df.loc[条件, df['ln_1_adr']]的写法会创建列的副本,带来额外的内存开销和计算延迟。改用pandas的向量化方法mask()可以直接对列进行高效处理,避免不必要的拷贝。

优化后的函数代码:

import pandas as pd

def concatenate_fields(df):
    df = pd.DataFrame(df).copy()
    for col in ['ln_1_adr','ln_2_adr','city_adr', 'state_adr', 'zip_5_adr','zip_4_adr']:
        df[col] = df[col].str.strip()
        if col in ('ln_1_adr','ln_2_adr'):
            df[col] = df[col].str.replace(r"-", " ", regex=False)
    # 替换原耗时行,使用向量化的mask方法
    df['ln_1_adr'] = df['ln_1_adr'].mask(df['ln_1_adr'] == df['ln_2_adr'], '')
    df["zip_plus_4"] = df.zip_5_adr.str.cat(df['zip_4_adr'], sep=' ', na_rep='')
    df["ADDRESS"] = df.ln_1_adr.str.cat(df[['ln_2_adr','city_adr', 'state_adr', 'zip_plus_4']], sep = ' ', na_rep='').str.strip()
                                            
    return df

补充说明

另外,也可以把原loc写法中的列索引改为字符串形式(即df.loc[df['ln_1_adr'] == df['ln_2_adr'], 'ln_1_adr'] = ''),这也能避免创建列副本的问题,提升运行效率。不过mask()方法的可读性和执行效率更优,推荐使用。

内容的提问来源于stack exchange,提问作者Jred

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:30