如何为DataFrame每行绘制曲线时排除首个0后冗余0值
处理方案
核心逻辑是逐行截断到首次出现0的位置,不要用替换NaN的方案——你之前遇到的报错本质是部分拟合、绘图接口不支持自动跳过NaN值,直接提取每行的有效连续段,得到无空值、无冗余拖尾的x/y数组,就能同时满足绘图和拟合的需求。
步骤1:加载依赖与原始数据
先导入需要的库,构建你给出的示例DataFrame:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 构建原始数据表 df = pd.DataFrame( [ [85,75,65,52,39,21,12,5,2,0], [80,69,52,48,21,12,5,2,0,0], [81,68,61,49,32,25,14,4,1,0], [82,64,43,32,19,5,0,0,0,0], [79,64,49,41,22,6,2,0,0,0] ], columns=[0,5,15,20,25,30,35,40,45,50] ) x_total = df.columns.values.astype(float) # 列名作为x轴(离站距离,单位英尺)
步骤2:逐行提取有效曲线段
遍历每一行,找到第一个0值的索引,截断后续所有冗余0,保留从距离0到首次0值(包含该0值)的完整有效数据:
valid_curves = [] for _, row in df.iterrows(): y = row.values # 查找第一个0的位置,兼容某行无0值的边界情况 zero_pos = np.where(y == 0)[0] if len(zero_pos) > 0: cut_idx = zero_pos[0] x_valid = x_total[:cut_idx + 1] y_valid = y[:cut_idx + 1] else: # 若该行无0值则保留全量数据 x_valid = x_total y_valid = y valid_curves.append((x_valid, y_valid))
处理后每条曲线的终止点就是首次降到0的位置,没有多余的0值拖尾,且所有数组都不含空值、无穷值,不会触发你之前遇到的类型报错。
步骤3:绘制独立单图
逐一生成5张单曲线图即可,曲线会自然在0点终止,不会出现长拖尾:
for curve_id, (x, y) in enumerate(valid_curves): plt.figure(figsize=(6, 3)) plt.plot(x, y, 'o-', linewidth=2) plt.xlabel('离站距离(英尺)') plt.ylabel('指标观测值') plt.title(f'第{curve_id+1}条衰减曲线') plt.ylim(bottom=-2) # 预留少量边距清晰展示0点 plt.grid(alpha=0.3) plt.show()
步骤4:曲线拟合
处理后的x、y数组可以直接传入任意拟合接口,不管是numpy多项式拟合还是scipy非线性拟合都能正常运行。以常用的指数衰减模型拟合为例:
# 定义指数衰减方程 def decay_func(x, a, k, b): return a * np.exp(-k * x) + b # 逐行拟合输出参数 for curve_id, (x, y) in enumerate(valid_curves): popt, _ = curve_fit(decay_func, x, y, p0=[80, 0.05, 0]) print(f"曲线{curve_id+1}拟合参数:a={popt[0]:.2f}, k={popt[1]:.3f}, b={popt[2]:.2f}")
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

