Pandas处理Floor列提取首层数据出错,求问题原因解析
问题分析与修正
原始数据
0 Ground out of 2 1 1 out of 3 2 1 out of 3 Name: Floor, dtype: object
错误原因
你的代码存在三个核心问题:
- 语法错误:
lower_floors = ['Ground','Basement]中'Basement'缺少闭合引号,实际运行会触发语法报错(你给出的输出可能是输入时的笔误)。 - 变量名不一致:定义了
first_floor = [],但追加元素时用的是floor_location.append(),这会导致floor_location未定义的报错。 - 循环逻辑错误:
- 内层循环没有
break:当匹配到Ground时,你追加了'0',但内层循环会继续遍历Basement,之后触发与内层for绑定的else块,再次追加data[:2](即Gr),导致单条数据被处理两次,结果多了一个冗余元素。 else缩进错误:原代码的else属于内层for循环,而非外层的条件判断,无论是否匹配到底层关键词,只要内层循环正常结束,都会执行else块的追加操作。
- 内层循环没有
修正后的代码
方案1:修复循环逻辑
first_floor = [] lower_floors = ['Ground', 'Basement'] # 修正引号 for data in df.Floor: matched = False for keyword in lower_floors: if keyword in data: first_floor.append('0') matched = True break # 匹配到后立即跳出内层循环,避免重复处理 if not matched: # 若需要保留空格,可替换成 first_floor.append(data[:2]) first_floor.append(data.split()[0])
方案2:用正则简化逻辑(更健壮)
import re first_floor = [] lower_floors = ['Ground', 'Basement'] num_pattern = re.compile(r'\d+') for data in df.Floor: if any(keyword in data for keyword in lower_floors): first_floor.append('0') else: # 提取字符串中的第一个数字 match = num_pattern.search(data) if match: first_floor.append(match.group())
修正后结果
运行上述代码会得到你期望的结果:['0', '1', '1'](如果需要保留空格,方案1中改用first_floor.append(data[:2])即可得到['0', '1 ', '1 '])。
内容的提问来源于stack exchange,提问作者star_platinum98
相关产品推荐
相关产品推荐

