You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:32:41