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

绘制DataFrame分组折线图并用np.polyfit拟合提取斜率方案

实现方案

你之前用np.array_split拆分未达预期的核心原因:该函数默认沿行方向切分DataFrame,而你需要的是按列名前缀(A/B/C)沿列方向分组,拆分规则和维度都不匹配。
以下是可直接运行的完整实现:

1. 前置准备与数据构造

首先导入依赖,注意原表格中第三列列名重复标注为A2,结合需求实际应为A3,先做修正:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 构造示例数据
df = pd.DataFrame(
    [
        [0.1, 0.1, 0.4, 0.1, 0.2, 0.4, 0.1, 0.2, 0.4],
        [0.4, 0.1, 0.4, 0.5, 0.2, 0.4, 0.3, 0.4, 0.5],
        [0.3, 0.4, 0.05, 0.6, 0.9, 0.4, 0.5, 0.7, 0.6]
    ],
    columns=["A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3"]
)
list_A = [10, 20, 30]

2. 按列前缀分组

直接按列名首字符把列分到A/B/C三组,不需要硬编码索引,后续列顺序变动也能正常运行:

group_cols = {}
for col in df.columns:
    prefix = col[0]
    if prefix not in group_cols:
        group_cols[prefix] = []
    group_cols[prefix].append(col)
# 按A、B、C固定顺序取分组列
groups = [group_cols["A"], group_cols["B"], group_cols["C"]]

3. 绘图+斜率计算

遍历每个分组,逐组绘制独立折线图,同时对每条折线做线性拟合提取斜率:

output = []
x = np.array(list_A)

for idx, cols in enumerate(groups):
    # 创建独立画布
    plt.figure(figsize=(6,4))
    group_slopes = []
    for col in cols:
        y = df[col].values
        # 绘制原始折线
        plt.plot(x, y, marker="o", label=col)
        # 一阶线性拟合,返回值顺序为斜率、截距
        slope, intercept = np.polyfit(x, y, deg=1)
        group_slopes.append(slope)
        # 可选:绘制拟合虚线,不需要可直接注释
        plt.plot(x, slope*x + intercept, linestyle="--", label=f"{col} fit")
    # 图表样式配置
    plt.xlabel("X value (list_A)")
    plt.ylabel("Y value")
    plt.title(f"Group {chr(ord('A')+idx)} Line Chart")
    plt.legend()
    plt.grid(alpha=0.3)
    plt.show()
    # 存入当前组斜率结果
    output.append(group_slopes)

4. 结果说明

运行后会依次弹出3张独立折线图,output变量即为要求格式的嵌套列表,以上述示例数据计算得到的结果为:

[
 [0.01, 0.015, -0.0175],
 [0.025, 0.035, 0.0],
 [0.02, 0.025, 0.01]
]

注:如果不需要显示拟合虚线,直接删掉对应绘图代码即可,斜率计算逻辑不受影响。


内容的提问来源于stack exchange,提问作者prob2050

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:51:25