如何使用Pandas替换Excel数据指定值并解决replace属性报错
问题背景
编写Python脚本通过pandas读取Excel文件生成SQL INSERT命令,需要对读取到的特定字符串做替换处理,运行时触发如下报错:
AttributeError: 'Pandas' object has no attribute 'replace'
原问题脚本代码如下:
import pandas as pd df = pd.read_excel('JulyData.xlsx') # print(df) # print(df.iloc[0, 0]) print('INSERT INTO project(name, object, amount, value)') for row in df.itertuples(index=False): rowString = row rowString = rowString.replace(' " ', " ") rowString = rowString.replace(' – ', " ") rowString = rowString.replace(' / ', " & ") rowString = rowString.replace(' ’ ', " ") print(f'VALUES {tuple(rowString)}') print(f'WAITFOR DELAY \'00:00:02\'') print('\n')
涉及的示例数据结构如下:
{'name': ['Xu–, Yi', 'Gare, /Mark'], 'object': ['xuy@anes’.mty.edu', '"gareg@msu.edu'], 'amount': ['100', '200'], 'value': ['"abc"', 'def']}
核心疑问:pandas中如何正确实现上述字符串替换需求?
报错原因
itertuples() 遍历DataFrame时返回的是Pandas自定义的命名元组对象,不是字符串类型,直接对元组对象调用字符串专属的.replace()方法必然会触发属性不存在的错误。原代码的替换逻辑实际需要作用在元组内的每个字符串字段上,而非元组本身。
正确实现方案
优先在遍历前对整个DataFrame做批量字符串替换,比逐行逐字段处理效率更高,参考代码如下:
import pandas as pd df = pd.read_excel('JulyData.xlsx') # 批量对所有字段做字符串替换,先把非字符串类型的列转成字符串避免报错 df = df.astype(str) replace_map = { ' " ': ' ', ' – ': ' ', ' / ': ' & ', ' ’ ': ' ' } for old_str, new_str in replace_map.items(): df = df.apply(lambda col: col.str.replace(old_str, new_str, regex=False)) print('INSERT INTO project(name, object, amount, value)') for row in df.itertuples(index=False, name=None): print(f'VALUES {row}') print("WAITFOR DELAY '00:00:02'") print('\n')
方案说明
- 先通过
df.astype(str)把所有列统一转为字符串类型,避免数值列调用字符串方法时报错 - 把需要替换的键值对整理成映射字典,后续要调整替换规则直接改字典即可,不用重复写replace语句
- 用
df.apply配合str.replace对整列做批量替换,是pandas处理字符串替换的标准写法,regex=False参数表示按固定字符串匹配替换,不需要正则解析,速度更快 itertuples加name=None参数直接返回普通元组,省去额外转tuple的步骤
注:代码里出现的
–、’这类乱码本质是Excel文件读取时的编码不匹配问题,如果要从根源解决,可以在read_excel时指定正确的编码参数,不用事后替换乱码。
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

