Pandas导入Excel数据后去除NaN值并绘图的问题求助
解决Pandas导入Excel后NaN值处理及绘图问题
问题原因
你执行了df = df.values,这会把Pandas DataFrame转换成NumPy数组,而notna()是Pandas专属的方法,NumPy数组没有这个属性,因此触发AttributeError。
解决方案
推荐优先保留Pandas DataFrame格式处理数据(操作更灵活),也可以用NumPy方法直接处理数组。
方案1:用Pandas DataFrame处理缺失值
直接保留DataFrame,跳过无效行后合并需要的列,再删除含NaN的记录:
import pandas as pd import matplotlib.pyplot as plt # 读取Excel,保持DataFrame格式 df = pd.read_excel('CSTRS Chem Eng Practicals_2.xlsx', sheet_name='Flow Rates') # 跳过前4行无关数据,重置索引 df_clean = df.iloc[4:].reset_index(drop=True) # 提取需要的时间和浓度列,合并为新DataFrame processed_data = pd.DataFrame({ 'Time': df_clean.iloc[:, 0], 'Conc1': df_clean.iloc[:, 2], 'Conc2': df_clean.iloc[:, 4], 'Conc3': df_clean.iloc[:, 6], 'Conc4': df_clean.iloc[:, 8], 'Conc5': df_clean.iloc[:, 10] }).dropna() # 删除任何含NaN的行 # 提取处理后的数据用于绘图 Time2 = processed_data['Time'].values Conc1 = processed_data['Conc1'].values Conc2 = processed_data['Conc2'].values # ...其他浓度列同理 # 绘图示例 plt.plot(Time2, Conc1, label='Conc1') plt.plot(Time2, Conc2, label='Conc2') plt.xlabel('Time') plt.ylabel('Concentration') plt.legend() plt.show()
如果只需要保留某几列的有效行,可以用subset参数指定,比如.dropna(subset=['Time', 'Conc1'])仅删除时间或Conc1为NaN的行
方案2:用NumPy处理数组中的NaN值
如果坚持用数组操作,用np.isnan()生成过滤掩码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_excel('CSTRS Chem Eng Practicals_2.xlsx', sheet_name='Flow Rates') df_array = df.values # 提取原始数据 Time2 = df_array[4:, 0] Conc1 = df_array[4:, 2] # 生成掩码:过滤掉Time2或Conc1中含NaN的行 valid_mask = ~np.isnan(Time2) & ~np.isnan(Conc1) # 得到清理后的数据 Time2_clean = Time2[valid_mask] Conc1_clean = Conc1[valid_mask] # 绘图 plt.plot(Time2_clean, Conc1_clean) plt.xlabel('Time') plt.ylabel('Conc1') plt.show()
内容的提问来源于stack exchange,提问作者Jess Crow
相关产品推荐
相关产品推荐

