Pandas按指定列条件填充另一列值,自定义函数运行无结果问题求助
问题修复方案
原有代码错误原因
- 核心语法错误:给
Main Product Family列赋值时误写了双等号==,这是相等判断运算符,不会实际修改列的取值,是填充失败的直接原因 - 逻辑不完整:没有优先判断
product group列是否存在有效值,不符合需求的优先级规则 - 性能缺陷:Pandas逐行遍历的实现效率极低,数据量超过1万行时会有明显的性能问题,更推荐使用向量化操作实现
最优实现方案(向量化操作,无需自定义函数)
- 首先将
product group的有效值直接映射到Main Product Family列,非有效值位置置为NaN
import pandas as pd # 空值判定同时覆盖NaN和空字符串两种场景 df['Main Product Family'] = df['product group'].where( df['product group'].notna() & (df['product group'] != '') )
- 定义
Record Type到产品族的映射字典,后续新增映射规则直接修改字典即可
record_type_map = { 'bte-pmx': 'PMX', 'bt_us-FM': 'GTRate' }
- 对
Main Product Family的空值行,通过映射关系填充
df['Main Product Family'] = df['Main Product Family'].fillna( df['Record Type'].map(record_type_map) )
原有自定义函数修正版
如果你需要保留自定义函数的实现方式,修正后的代码如下:
def func(x): for i in range(0,len(x)): # 优先判断product group是否有有效值 if pd.notna(x.iloc[i,0]) and x.iloc[i,0] != '': x.iloc[i,3] = x.iloc[i,0] else: if x.iloc[i,2] == 'bte-pmx': # 把双等号改为单等号实现赋值 x.iloc[i,3] = 'PMX' return x # 调用函数后需要重新赋值给原DataFrame df = func(df)
内容的提问来源于stack exchange,提问作者mtm1186
相关产品推荐
相关产品推荐

