绘制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
相关产品推荐
相关产品推荐

