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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:27:31