如何移除Pandas DataFrame列中括号内内容及末尾数字?
解决方案
1. 直接可用的清理代码
用Pandas的str.replace结合正则表达式,一次就能搞定两种格式问题:
# 一步移除括号内容和末尾数字 Energy['Country'] = Energy['Country'].str.replace(r'\s*\(.*?\)|\d+$', '', regex=True).str.strip()
正则说明:
\s*\(.*?\):匹配括号前的空格(可选)+ 括号及内部所有内容(非贪婪模式,避免多括号匹配错误)|\d+$:用|连接第二种匹配规则,匹配末尾的一个或多个数字- 最后加
.str.strip()是为了清理替换后可能残留的多余空格
如果想分步处理更清晰,也可以拆成两步:
# 先清括号内容,再清末尾数字 Energy['Country'] = Energy['Country'].str.replace(r'\s*\(.*?\)', '', regex=True) Energy['Country'] = Energy['Country'].str.replace(r'\d+$', '', regex=True).str.strip()
2. 排查操作无效的常见坑点
- 必须开正则模式:Pandas的
str.replace默认regex=False,会把正则表达式当成普通字符串匹配,一定要加regex=True参数 - 检查列名和赋值:确认列名是
Country(注意大小写),且清理后的值要赋值回原列,不然等于白操作 - 处理空值:如果列里有空值,先填充空字符串再处理:
Energy['Country'] = Energy['Country'].fillna('') - 验证正则有效性:拿样本字符串单独测试,确认正则逻辑没问题:
import re test_cases = ['Iran (Islamic Republic of)', 'Netherlands12', 'France (Metropolitan)3'] for s in test_cases: print(f"原内容: {s} → 清理后: {re.sub(r'\s*\(.*?\)|\d+$', '', s).strip()}")
3. 完整测试示例
import pandas as pd # 模拟你的DataFrame Energy = pd.DataFrame( {'Country': ['Iran (Islamic Republic of)', 'Netherlands12', 'Germany (Federal Republic)45', 'Canada', '']}, dtype='string' ) # 执行清理 Energy['Country'] = Energy['Country'].str.replace(r'\s*\(.*?\)|\d+$', '', regex=True).str.strip() print(Energy['Country'])
输出结果:
0 Iran 1 Netherlands 2 Germany 3 Canada 4 Name: Country, dtype: string
内容的提问来源于stack exchange,提问作者Carl Huxohl
相关产品推荐
相关产品推荐

