如何在Pandas DataFrame中移除地址列中的分数?
解决Pandas地址列移除分数的问题
嘿,我来帮你搞定这个地址清洗的问题!针对你的两个疑问,我一步步给你讲清楚:
1. 不用手动遍历DataFrame!
首先,Pandas提供了非常高效的矢量化字符串操作,完全不需要你手动循环每一行。直接用str.replace()方法就能对整个地址列批量处理,速度比循环快N倍,代码也更简洁。
2. 优化你的正则表达式
你的思路是对的,但可以让正则更简洁、更通用:
方法一:通用移除所有分数(不管位置)
如果你的地址里分数可能出现在任意位置,用这个正则直接匹配分数(比如1/4)以及它前后的空格,替换成单个空格,再清理首尾的多余空格:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'address': ['580 1/4 Broadway Street', '85 1/4 Grand Street'] }) # 清洗地址 df['clean_address'] = df['address'].str.replace(r'\s*\d+/\d+\s*', ' ', regex=True).str.strip()
\s*:匹配0个或多个空格(处理分数前后可能有1个或多个空格的情况)\d+/\d+:匹配分数格式(比如1/4、3/8等)- 最后用
str.strip()去掉首尾可能残留的空格
方法二:精准匹配街道号后的分数(针对你的示例场景)
如果分数总是紧跟在街道编号后面,用分组匹配更精准,避免误删其他可能的分数(虽然你的示例里没有,但更严谨):
df['clean_address'] = df['address'].str.replace(r'(\d+)\s+\d+/\d+\s+(.*)', r'\1 \2', regex=True)
(\d+):捕获街道编号(比如580、85)\s+\d+/\d+\s+:匹配街道号和街道名之间的分数及空格(.*):捕获后面的街道名称- 替换为
\1 \2:把街道编号和街道名用空格连接,去掉中间的分数
关于你原来的正则
你用的^(.*)\d+/\d+\s(.*)其实能工作,但.*是贪婪匹配,如果地址里有多个数字片段,可能会意外匹配到更多内容。比如如果地址是"123 45 1/2 Main St",它会把"123 45 "作为第一个分组,虽然结果是对的,但不如上面的正则精准或简洁。
最终效果
运行代码后,你的clean_address列会变成:
0 580 Broadway Street 1 85 Grand Street Name: clean_address, dtype: object
内容的提问来源于stack exchange,提问作者scarebear
相关产品推荐
相关产品推荐

