pandas处理dataframe列时筛选生效但赋值全为False的疑问
问题根因
- 你写的赋值语句
df3['total_sqft'] = ~df3['total_sqft'].apply(is_float)右侧的计算结果是一个全布尔值的序列:is_float函数返回True代表当前值可转换为合法浮点数(非范围格式),取反~后True对应你要找的范围格式条目,False对应合法数值条目。你直接把这个布尔序列整体赋值给了total_sqft整列,会完全覆盖原列的所有原始内容,自然不会得到你想要的「保留符合条件的条目内容」的效果。 - 你之前的筛选语句
df3[~df3['total_sqft'].apply(is_float)]只是用布尔掩码选中了符合条件的行,没有修改原数据,所以可以得到预期结果。
正确操作示例
如果你需要保留原列的合法数值,仅对范围格式的条目做处理,可参考如下代码:
- 先提取范围条目的掩码,单独查看这类条目
# 生成范围条目标识掩码 range_entry_mask = ~df3['total_sqft'].apply(is_float) # 查看所有范围格式的原始值 print(df3.loc[range_entry_mask, 'total_sqft'])
- 如果需要把范围值转换为上下限的平均数值统一处理,可直接用自定义函数映射整列:
def parse_sqft(x): # 处理范围格式 if '-' in str(x): low, high = x.split('-') return (float(low.strip()) + float(high.strip())) / 2 # 处理普通数值格式 try: return float(x) # 其他异常格式返回空值,后续可统一删除 except: return None df3['total_sqft'] = df3['total_sqft'].apply(parse_sqft)
内容的提问来源于stack exchange,提问作者Ahmed Malik
相关产品推荐
相关产品推荐

