如何遍历DataFrame并按多条件生成带清洗值的新test列
解决DataFrame按条件生成新列的问题
需求说明
- 若
PM No_列不为空,test列直接取该列的值 - 若
PM No_列为空,取No_列的值并按Condition列清洗:- 当
Condition为'9'时,移除No_中的'-0G' - 当
Condition为'1'时,移除No_中的'-0S' - 其他
Condition值直接保留No_原值
- 当
原代码问题分析
- 缩进错误:
for循环块内代码未正确缩进 - 逻辑倒置:判断
PM No_非空时去处理No_,与需求相反 - 批量处理错误:使用
df['No_'].str.split会返回整个Series,而非当前行的值 - 分支不全:未处理
Condition为其他值的情况
正确解决方案
方法1:使用apply(直观易读,适合小数据集)
def generate_test(row): pm_no = row['PM No_'] # 处理空字符串或仅含空格的情况 if pm_no.strip() != '': return pm_no condition = row['Condition'] no_val = row['No_'] if condition == '9': return no_val.replace('-0G', '') elif condition == '1': return no_val.replace('-0S', '') else: return no_val df['test'] = df.apply(generate_test, axis=1)
方法2:矢量化操作(高效,适合大数据集)
利用numpy.where和Pandas字符串方法,避免逐行循环:
import numpy as np # 分层判断赋值 df['test'] = np.where( df['PM No_'].str.strip() != '', df['PM No_'], np.where( df['Condition'] == '9', df['No_'].str.replace('-0G', '', regex=False), np.where( df['Condition'] == '1', df['No_'].str.replace('-0S', '', regex=False), df['No_'] ) ) )
验证结果
执行后得到的test列与期望一致:
| PM No_ | Condition | No_ | test |
|---|---|---|---|
| GVSU10K20H | 1 | GVSU10K20H | GVSU10K20H |
| 1Y002VMH | 5 | 1Y002VMH-0H | 1Y002VMH-0H |
| 9 | 2NX00ESRU-0G | 2NX00ESRU | |
| 20WNGE | 2 | 20WNGE | 20WNGE |
| 1 | C33761-0S | C33761 |
内容的提问来源于stack exchange,提问作者Asscha197
相关产品推荐
相关产品推荐

