
本文详解如何在使用pandas读取Excel数据后,精准剔除NaN值以确保后续数值计算与可视化(如绘图)顺利进行,避免因误用.values导致DataFrame方法失效的问题。
本文详解如何在使用pandas读取excel数据后,精准剔除nan值以确保后续数值计算与可视化(如绘图)顺利进行,避免因误用`.values`导致dataframe方法失效的问题。
在使用 pandas.read_excel() 导入Excel数据时,一个常见误区是过早调用 .values 将 DataFrame 转为 NumPy 数组——这会丢失所有 pandas 的方法(如 dropna()、notna()),从而引发 'numpy.ndarray' object has no attribute 'notna' 等错误。
您原始代码中的关键问题在于:
df = pd.read_excel('CSTRS Chem Eng Practicals_2.xlsx', sheet_name='Flow Rates')
df = pd.DataFrame(df) # 冗余操作(read_excel已返回DataFrame)
df = df.values # ⚠️ 此步将DataFrame转为ndarray,后续无法调用dropna()
Time2 = df[4:,0] # 此时df已是数组,但缺失值仍存在✅ 正确做法是:全程保留DataFrame结构,在切片前或后统一清理NaN,并按需提取列:
✅ 推荐解决方案(分步清晰、健壮可靠)
import pandas as pd
# 1. 读取Excel,保持为DataFrame
df = pd.read_excel('CSTRS Chem Eng Practicals_2.xlsx', sheet_name='Flow Rates')
# 2. 【关键】跳过前4行(若为表头/说明行),同时保留DataFrame结构
df_clean = df.iloc[4:].copy() # 使用iloc避免索引干扰
# 3. 删除含NaN的整行(针对您要提取的列:第0、2、4、6、8、10列)
# 方法一:仅对目标列判断是否全非空(推荐)
df_clean = df_clean.dropna(subset=[df_clean.columns[0],
df_clean.columns[2],
df_clean.columns[4],
df_clean.columns[6],
df_clean.columns[8],
df_clean.columns[10]])
# 4. 安全提取数据(自动去除NaN后的有效行)
Time2 = df_clean.iloc[:, 0].to_numpy() # 第0列 → 时间
Conc1 = df_clean.iloc[:, 2].to_numpy() # 第2列 → 浓度1
Conc2 = df_clean.iloc[:, 4].to_numpy() # 第4列 → 浓度2
Conc3 = df_clean.iloc[:, 6].to_numpy() # 第6列 → 浓度3
Conc4 = df_clean.iloc[:, 8].to_numpy() # 第8列 → 浓度4
Conc5 = df_clean.iloc[:, 10].to_numpy() # 第10列 → 浓度5
print("Time2:", Time2)
print("Conc1:", Conc1)? 补充说明与注意事项:
-
dropna()默认删除任意列含NaN的行;使用subset=[...]可限定仅检查指定列,更符合实验数据场景(例如只关心时间与各浓度列的有效配对)。 - 若需保留原始索引或处理多级缺失,可加参数:
how='all'(仅当所有指定列均为NaN才删)、thresh=5(至少5列非空才保留)。 - 提取为
.to_numpy()是为绘图(如matplotlib)提供纯数值数组;若后续还需pandas操作,可直接用df_clean['Column_Name']。 - ❌ 避免
df.values后再尝试.dropna()—— ndarray无此方法,必须在DataFrame阶段处理。
完成上述步骤后,Time2 与 Conc1~Conc5 即为长度一致、不含NaN的干净数组,可直接用于 plt.plot(Time2, Conc1) 等绘图操作,彻底规避空值报错与图形中断问题。


















