Pandas字符串拆分无法返回多元素,仅得单个元素问题排查
问题
我正在处理的DataFrame包含地址列,需从中提取街道名、门牌号、邮编、国家等变量,地址格式为“街道名 门牌号, 邮编 城市, 国家”。使用.str.split()可提取单个元素,但提取多元素时出现问题。提取国家很容易,但提取街道名和门牌号时遇到困难:街道名可能包含多个空格,但最后一个空格后始终是门牌号。
我先执行df["street_and_number"]=df["address"].str.split(",").str[0],得到包含街道名和门牌号的列,这一步没问题。之后尝试提取街道名,用df["street"]=df["street_and_number"].str.split().str[:-1],但返回的是列表(示例:1541 [Burgemeester, Roelenweg]),我需要的是字符串而非列表;使用expand=True参数也未得到预期结果(输出为含0、1、2列的空结构),请问我哪里操作错误?
解决方案
方法1:把拆分后的列表转回字符串
你用.str.split().str[:-1]得到的是拆分后的子列表,只需再用.str.join(' ')把列表里的元素用空格拼接成字符串即可:
df["street"] = df["street_and_number"].str.split().str[:-1].str.join(' ') # 同步提取门牌号 df["number"] = df["street_and_number"].str.split().str[-1]
方法2:用正则表达式一步提取(更高效)
既然明确地址格式的规律——街道名和门牌号以「最后一个空格」为分界,直接用正则extract方法一次性拆分,比两次拆分更简洁:
# 若门牌号是纯数字,用\d+匹配;如果门牌号含字母/符号,换成\S+匹配非空白字符 df[["street", "number"]] = df["street_and_number"].str.extract(r'(.*)\s(\d+)$')
为什么expand=True没用?
expand=True是把拆分后的列表展开成多列,但你的街道名拆分后元素数量不固定(有的是2个词,有的可能更多),会生成多列且大量空值,这和你想要合并成单个街道名字符串的需求完全不匹配,自然达不到预期效果。
内容的提问来源于stack exchange,提问作者broekeman

