影刀RPA 数据空值处理:填充删除与插值
影刀RPA 数据空值处理填充删除与插值作者林焱什么情况用什么数据里有空值不处理直接用——做统计时空值导致结果偏差、画图表时空值导致断线、写报表时空值显示NaN很丑。但盲目删除空值会丢失数据盲目填充会引入偏差。在影刀RPA里需要根据不同场景选择合适的空值处理策略。适用场景采集数据补全、报表生成前数据修复、时间序列缺失值插值、统计分析前数据准备。怎么做空值检查拼多多店群自动化报活动上架importpandasaspdimportnumpyasnp dfpd.read_excel(rC:\Data\sales.xlsx)# 检查每列空值情况print(各列空值统计)null_statspd.DataFrame({总行数:len(df),空值数:df.isnull().sum(),空值率:(df.isnull().sum()/len(df)*100).round(2).astype(str)%,数据类型:df.dtypes.astype(str)})print(null_stats)# 检查空值分布print(\n空值分布)forcolindf.columns:null_countdf[col].isnull().sum()ifnull_count0:print(f{col}:{null_count}个空值)删除策略# 1. 删除全空行dfdf.dropna(howall)# 2. 删除关键字段为空的行dfdf.dropna(subset[订单ID,金额])# 3. 删除空值超过阈值的行# 比如一行有5个以上字段为空则删除dfdf.dropna(threshlen(df.columns)-4)# 4. 删除空值过多的列# 空值率超过80%的列删除cols_to_drop[colforcolindf.columnsifdf[col].isnull().sum()/len(df)0.8]dfdf.drop(columnscols_to_drop)print(f删除空值过多的列:{cols_to_drop})填充策略# 1. 固定值填充df[备注]df[备注].fillna(无备注)df[状态]df[状态].fillna(未知)# 2. 统计值填充df[年龄]df[年龄].fillna(df[年龄].mean())# 均值df[工资]df[工资].fillna(df[工资].median())# 中位数更抗异常值df[频次]df[频次].fillna(df[频次].mode()[0])# 众数# 3. 分组填充更精确# 按部门填充平均工资df[工资]df.groupby(部门)[工资].transform(lambdax:x.fillna(x.mean()))# 4. 前后值填充时间序列适用df[温度]df[温度].ffill()# 用前一行填充df[温度]df[温度].bfill()# 用后一行填充# 5. 条件填充# 金额为空但数量和单价都有则计算填充maskdf[金额].isnull()df[数量].notna()df[单价].notna()df.loc[mask,金额]df.loc[mask,数量]*df.loc[mask,单价]插值法# 线性插值适合时间序列df[销售额]df[销售额].interpolate(methodlinear)# 时间索引插值df[日期]pd.to_datetime(df[日期])dfdf.set_index(日期)df[销售额]df[销售额].interpolate(methodtime)# 多项式插值df[销售额]df[销售额].interpolate(methodpolynomial,order2)# 限制插值范围最多连续插2个df[销售额]df[销售额].interpolate(methodlinear,limit2)智能填充函数defsmart_fillna(df,column,strategyauto,group_colNone): 智能填充空值 strategy: auto/mean/median/mode/ffill/zero/custom group_col: 分组列名 null_countdf[column].isnull().sum()ifnull_count0:returndfifstrategyauto:# 根据数据类型自动选择ifdf[column].dtypein[int64,float64]:# 数值型用中位数strategymedianelse:# 分类型用众数strategymodeifgroup_col:# 分组填充ifstrategymean:df[column]df.groupby(group_col)[column].transform(lambdax:x.fillna(x.mean()))elifstrategymedian:df[column]df.groupby(group_col)[column].transform(lambdax:x.fillna(x.median()))elifstrategymode:df[column]df.groupby(group_col)[column].transform(lambdax:x.fillna(x.mode()[0]ifnotx.mode().emptyelsex))else:# 全局填充ifstrategymean:df[column]df[column].fillna(df[column].mean())elifstrategymedian:df[column]df[column].fillna(df[column].median())elifstrategymode:mode_valdf[column].mode()ifnotmode_val.empty:df[column]df[column].fillna(mode_val[0])elifstrategyffill:df[column]df[column].ffill()elifstrategyzero:df[column]df[column].fillna(0)fillednull_count-df[column].isnull().sum()print(f{column}: 填充{filled}个空值 (策略:{strategy}))returndf# 使用dfsmart_fillna(df,工资,strategymedian,group_col部门)dfsmart_fillna(df,城市,strategymode)dfsmart_fillna(df,年龄,strategymedian)影刀RPA空值处理流程【读取Excel文件】→ 带空值的数据 【执行Python代码】→ 空值检查报告 【执行Python代码】→ 智能填充 - 数值列分组中位数填充 - 文本列众数填充 -  - 时间列前向填充 【执行Python代码】→ 验证填充结果 【写入Excel文件】→ 清洗后数据有什么坑坑1fillna(method)弃用警告TEMU店群矩阵自动化运营核价报活动# 旧写法pandas 2.0已弃用df[列].fillna(methodffill)# FutureWarning# 新写法df[列]df[列].ffill()df[列]df[列].bfill()坑2均值填充导致数据偏斜# 问题用全局均值填充所有空值变成同一个数分布出现尖峰# 解决加随机扰动mean_valdf[工资].mean()std_valdf[工资].std()# 均值附近随机值填充df[工资]df[工资].apply(lambdax:np.random.normal(mean_val,std_val*0.1)ifpd.isna(x)elsex)坑3分组填充时某些组全是空值# 问题某部门所有人工资都是空值groupby后mean()还是NaNdf[工资]df.groupby(部门)[工资].transform(lambdax:x.fillna(x.mean()))# 该部门的工资还是NaN# 解决分组填充后补充全局填充df[工资]df.groupby(部门)[工资].transform(lambdax:x.fillna(x.mean()))df[工资]df[工资].fillna(df[工资].mean())# 补充全局均值坑4插值法的边界问题# 问题时间序列的第一个值为空interpolate无法填充df[值]df[值].interpolate()# 第一个空值还是空# 解决先bfill再interpolatedf[值]df[值].bfill().interpolate()# 或df[值]df[值].interpolate().bfill().ffill()坑5空值类型混淆# 问题None、NaN、空字符串、字符串null混在一起# isnull()只能检测None和NaN# 解决统一转换dfdf.replace({:None,null:None,NULL:None,N/A:None,N/A:None,nan:None})dfdf.where(pd.notnull(df),None)# 然后再处理df[列]df[列].fillna(默认值)