Pandas如何从另一列的子字符串提取内容生成新列
问题根因
你的代码失效有两个直接原因:
- 构造数据时没有把字典转为
pd.DataFrame对象,直接对字典调用str方法本身就不符合Pandas语法 - 正则表达式错误添加了
^开头匹配符:房间数、面积对应的数字都不在字符串起始位置,正则完全匹配不到目标内容,str.replace在无匹配项时会直接返回原字符串,因此两列都输出了完整的title内容。
补充:提取固定规则的子串时,用str.extract直接捕获目标分组比str.replace替换整串逻辑更简单,不容易出错。
可直接运行的修正代码
import pandas as pd # 正确初始化DataFrame df = pd.DataFrame({ 'title':['Apartment 2 roomns, 40 m²', 'House 7 rooms, 183 m²', 'House 4 rooms, 93 m²', 'Apartment 12 rooms, 275 m²'] }) # 提取物业名称(原写法逻辑正确,补全对title列的规范调用即可) df['Name'] = df['title'].str.extract(r'(^[a-zA-Z]+)', expand=True) # 提取房间数:捕获room前缀词前的数字,自动兼容第一条数据的roomns拼写误差 df['Rooms'] = df['title'].str.extract(r'(\d+)\s+room', expand=True).astype(int) # 提取面积:捕获逗号后、m²单位前的数字 df['Size'] = df['title'].str.extract(r',\s*(\d+)\s+m²', expand=True).astype(int)
运行结果
执行代码后打印df,即可得到你预期的输出:
title Name Rooms Size 0 Apartment 2 roomns, 40 m² Apartment 2 40 1 House 7 rooms, 183 m² House 7 183 2 House 4 rooms, 93 m² House 4 93 3 Apartment 12 rooms, 275 m² Apartment 12 275
正则说明
- 房间数提取正则
(\d+)\s+room:匹配1个及以上连续数字,跳过数字后任意长度空白,匹配room开头的房间单位词,不需要严格匹配完整的rooms,容错性更高 - 面积提取正则
,\s*(\d+)\s+m²:先定位到分隔名称/房间数和面积的逗号,跳过逗号后可能存在的空白,捕获后续连续数字,再匹配数字后的空白和m²单位,不会出现匹配错位 - 末尾的
.astype(int)将提取出的字符串格式数字转为整数类型,方便后续做数值统计、计算,如果不需要数值类型可以删除该部分。
内容的提问来源于stack exchange,提问作者ladybug
相关产品推荐
相关产品推荐

