Pandas DataFrame按分隔符拆分列值并映射至多列的实现方案
解决Pandas地址拆分错位问题:精准映射city/state/country列
问题背景
现有Pandas DataFrame包含location_name、city、state、country列,需要将location_name中的逗号分隔地址拆分后,准确对应到后三列。已知核心规则:
location_name的地址格式不固定,最后一项始终是国家名- 街道、城市、州字段为可选(可能缺失)
- 直接使用
df[['city','state', 'country']] = df['location_name'].str.split(',', expand=True)会因字段缺失导致列映射错位。
解决方案
核心思路是先拆分地址为清洗后的列表,从后往前提取固定位置的字段,缺失项自动填充None(或空值),避免错位。
实现代码
import pandas as pd # 示例测试数据 data = { 'location_name': [ 'New York, NY, USA', 'London, UK', 'Paris, France', 'Beijing, China', 'Sydney, NSW, Australia', 'Toronto, Canada', '123 Main St, Chicago, IL, USA' # 含街道的复杂地址 ] } df = pd.DataFrame(data) # 定义地址解析函数 def parse_location(location_str): # 拆分地址并去除每个片段的首尾空格 parts = [p.strip() for p in location_str.split(',')] # 从后往前提取对应字段 country = parts[-1] # 州字段:仅当地址片段数≥2时取倒数第二项,否则为None state = parts[-2] if len(parts) >= 2 else None # 城市字段:片段数≥3时取倒数第三项;仅2个片段时取第一项;否则为None city = parts[-3] if len(parts) >= 3 else parts[0] if len(parts) == 2 else None return pd.Series([city, state, country]) # 应用解析函数到DataFrame df[['city', 'state', 'country']] = df['location_name'].apply(parse_location) print(df)
代码说明
- 先对地址字符串做清洗拆分:按逗号分割后,去除每个片段的首尾空格,避免地址中的冗余空格干扰判断
- 固定提取逻辑:
- 无论地址有多少片段,最后一项直接作为
country - 州字段仅在地址片段数≥2时提取倒数第二项,否则留空
- 城市字段根据片段数动态判断:3段及以上取倒数第三项,2段时取第一项,1段时留空
- 无论地址有多少片段,最后一项直接作为
- 用
pd.Series返回结果,直接映射到目标列,保证列对齐
输出示例
location_name city state country 0 New York, NY, USA New York NY USA 1 London, UK London None UK 2 Paris, France Paris None France 3 Beijing, China Beijing None China 4 Sydney, NSW, Australia Sydney NSW Australia 5 Toronto, Canada Toronto None Canada 6 123 Main St, Chicago, IL, USA Chicago IL USA
扩展说明
如果需要保留街道信息,可以在函数中新增street字段的提取逻辑:当地址片段数≥3时,将前len(parts)-2个片段合并为街道内容,不影响city/state/country的映射逻辑。
内容的提问来源于stack exchange,提问作者ozzboy
相关产品推荐
相关产品推荐

