如何以Pythonic方式用df.columns.str.replace替换DataFrame列名特殊字符
问题:如何用Pythonic方式批量替换DataFrame列名中的特殊字符?
先还原一下你的场景代码:
>>> df1 start name 0 score (C) D; % 0 one 0 0 foo 1 one 1 2 bar 2 two 2 4 foo 3 three 3 6 bar 4 two 4 8 foo 5 two 5 10 bar 6 one 6 12 foo 7 three 7 14 foo >>> char1 = ["\s+" , "(" , ")" , "%" , ";"] >>> char2 = ["_" , "" , "", "percent" , ""]
嘿,这个需求很常见,用df.columns.str.replace配合zip()就能很优雅地解决,完全符合Pythonic的风格~
解决方案:循环遍历替换对
最直观也最易读的方式就是把char1和char2的对应元素配对,然后依次对列名执行替换:
# 遍历每一组替换规则 for old_char, new_char in zip(char1, char2): df1.columns = df1.columns.str.replace(old_char, new_char, regex=True)
执行完后,你的列名会变成:['start_name', '0', 'score_C_D', 'percent']
为什么这是Pythonic的?
- 用
zip()把两个列表的对应元素打包,逻辑清晰,避免了手动索引的冗余代码 - 循环简洁直接,符合Python"可读性优先"的设计哲学
- 利用Pandas内置的
str.replace方法,不需要自己造轮子处理字符串替换
进阶:用reduce实现一行式替换
如果你偏爱更紧凑的写法,也可以用functools.reduce()把所有替换操作链式整合:
from functools import reduce df1.columns = reduce( lambda cols, replace_pair: cols.str.replace(*replace_pair, regex=True), zip(char1, char2), df1.columns )
不过这种写法虽然简洁,但可读性稍弱一些,日常开发中更推荐第一种循环的方式。
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

