如何通过单行代码重命名列并调整列名中数字的位置
Pandas 批量重命名分组列的解决方案
核心逻辑
- 仅需要定义每组内4种列类型到新名称前缀的映射,无需手动编写16组键值对的大型字典
- 用正则一次性匹配列名中的分组数字和列类型,直接查表拼接生成目标列名
- 支持所有4组共16列的自动匹配,其他非CHARGE开头的列会保留原名不受影响
单行实现代码
Python 3.8+ 支持海象运算符的场景,直接运行以下代码即可:
import re; df.rename(columns=lambda x: (m:=re.match(r'CHARGE (\d+) (\w+)', x)) and {'STATUTE':f'ChrgStatute{m.group(1)}','DESCRIPTION':f'ChrgDesc{m.group(1)}','TYPE':'ArrstngChrgFelMisd','CLASS':f'ArrstngChrgSvrtyOrgnl{m.group(1)}'}[m.group(2)] or x)
如果使用低于Python 3.8的版本,不支持海象运算符,可用以下兼容版本:
import re; df.rename(columns=lambda x: {'STATUTE':f'ChrgStatute{re.search(r"CHARGE (\d+) (\w+)",x).group(1)}','DESCRIPTION':f'ChrgDesc{re.search(r"CHARGE (\d+) (\w+)",x).group(1)}','TYPE':'ArrstngChrgFelMisd','CLASS':f'ArrstngChrgSvrtyOrgnl{re.search(r"CHARGE (\d+) (\w+)",x).group(1)}'}[re.search(r"CHARGE (\d+) (\w+)",x).group(2)] if re.match(r"CHARGE (\d+) (\w+)",x) else x)
效果验证
拿你给出的示例测试:
orig = ["CHARGE 1 STATUTE", "CHARGE 1 DESCRIPTION", "CHARGE 1 TYPE", "CHARGE 1 CLASS"]
重命名后的输出结果完全匹配你的预期:['ChrgStatute1', 'ChrgDesc1', 'ArrstngChrgFelMisd', 'ArrstngChrgSvrtyOrgnl1']
组号为2/3/4的列也会自动对应拼接正确的数字后缀,不需要额外调整代码。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

