如何在pandas df填充na值时不转为Series及代码优化
问题根因
当lsl列存在时,你的代码直接将df变量赋值为df['lsl'].fillna(...)的返回结果,而pandas中单独取单列返回的是Series类型,直接覆盖原有DataFrame变量后,自然会导致后续针对DataFrame的操作报错。
修正后可正常运行的代码
import pandas as pd import plotly.express as px def plot_lsl(df): print(type(df)) if 'status' not in df.columns: # 可以根据业务需求调整异常处理逻辑,比如抛错、返回空图等 raise ValueError("传入的DataFrame不存在必要的status列") # 提前提取公共判断逻辑,减少重复计算 status_eq_5 = df['status'].astype(int, errors='ignore') == 5 if 'lsl' in df.columns: # 只修改lsl列,不重新赋值整个df变量 df['lsl'] = df['lsl'].fillna(status_eq_5) else: df['lsl'] = status_eq_5 print(type(df)) df = df.dropna(subset=['lsl']) df['id'] = df['id'].str.upper() lsl_plot = px.scatter(data_frame=df, x='ts', y='lsl', color='id') return lsl_plot
代码优化思路
- 提前校验必要列是否存在,比如
status、id、ts列,出现缺失时提前抛出清晰的报错信息,避免后续逻辑出现不可预期的异常 - 重复计算的逻辑提前提取为变量,既减少冗余计算,也方便后续统一修改规则
- 如果不想修改传入的原DataFrame,可以在函数开头新增
df = df.copy(),避免出现链式赋值警告,也不会影响函数外的原数据 - 调用plotly.express绘图时,x、y参数直接传列名字符串即可,不需要写
df.ts、df.lsl,写法更简洁
内容的提问来源于stack exchange,提问作者aj7amigo
相关产品推荐
相关产品推荐

