Pandas最优实现:根据sqft/acres列条件填充lot_square_feet列
Pandas 条件填充
lot_square_feet列最优方案 规则确认
- 操作对象为包含
sqft、acres、lot_square_feet三列的DataFrame - 填充逻辑:
sqft列存在大于0的有效值时,直接取该值填入lot_square_feetacres列存在大于0的有效值时,将值乘以43560完成英亩到平方英尺的换算后,再填入lot_square_feetsqft与acres不会同时出现大于0的有效值,无需处理值冲突场景
过往尝试方案的问题
之前测试的三段代码均存在语法或逻辑错误,无法正常输出正确结果:
- 掩码赋值方案:列名拼写错误(将
sqft写为sq1),直接对DataFrame对象使用Python原生or运算符会触发pandas真值歧义报错,且未实现acres到平方英尺的换算逻辑 - 自定义循环函数方案:列名拼写错误,函数内return赋值语句不符合Python语法规范,逐行
iloc遍历+apply的实现方式性能极低,不适合DataFrame批量数据处理 - Lambda表达式方案:列名拼写错误,
apply参数传递逻辑错误(行级apply默认传入整行Series对象,无需拆分x、y两个入参),同样未实现单位换算逻辑
之前得到正确结果大概率是调试过程中某步临时编写的向量化赋值语句生效,无需回溯具体生效步骤,直接使用标准最优方案即可。
最优实现(向量化运算,性能最优)
优先选择numpy向量化判断实现,无逐行循环、运行效率最高,逻辑直观易维护:
import numpy as np # 提前计算英亩转平方英尺的结果 acres_converted = df['acres'] * 43560 # 按规则分层判断赋值 df['lot_square_feet'] = np.where( df['sqft'] > 0, df['sqft'], np.where( df['acres'] > 0, acres_converted, df['lot_square_feet'] # 两列均无有效值时保留原列数据 ) )
如果不想引入numpy依赖,也可以使用pandas原生的combine_first方法实现,利用两列无值冲突的特性,代码更简洁:
# 分别过滤两列的有效值,无效值置为NaN valid_sqft = df['sqft'].where(df['sqft'] > 0) valid_acres_sqft = (df['acres'] * 43560).where(df['acres'] > 0) # 按优先级填充:sqft有效值 > 换算后acres有效值 > 原lot_square_feet值 df['lot_square_feet'] = valid_sqft.combine_first(valid_acres_sqft).combine_first(df['lot_square_feet'])
上述两种方案均为纯向量化实现,处理百万行级数据集时也可在毫秒级完成运算,完全匹配业务规则,无语法兼容问题
内容的提问来源于stack exchange,提问作者canconfirm24
相关产品推荐
相关产品推荐

