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

按索引步长2遍历DataFrame列绘图的报错修复及优化方法

问题解决:修复折线图遍历代码错误及优化方案

错误原因

你写的n = df_scales.shape[1]-1得到的是一个整数(此处为3),而for index in n试图遍历整数,必然触发TypeError: 'int' object is not iterable。需要生成步长为2的可迭代索引序列,因为每组数据占2列(x和y)。

修复后的基础代码

直接修正循环逻辑,同时优化图例显示,把两条线画在同一张图中:

import pandas as pd
import matplotlib.pyplot as plt

# 示例DataFrame(可替换为你的数据)
df_scales = pd.DataFrame({
    'M1_x': [2,4,8,16],
    'M1_y': [0.861626, 0.685437, 0.495346, 0.327949],
    'M2_x': [2,4,8,16],
    'M2_y': [0.980591, 0.647706, 0.303102, 0.133477]
})

# 生成步长为2的索引序列,取每组x列的索引(0、2)
for index in range(0, df_scales.shape[1], 2):
    x = df_scales.iloc[:, index]
    y = df_scales.iloc[:, index+1]
    # 从列名提取分组标识(如M1、M2)
    group_label = df_scales.columns[index].split('_')[0]
    plt.plot(x, y, marker='o', label=group_label)

plt.legend()  # 添加图例区分两条线
plt.xlabel('X值')
plt.ylabel('Y值')
plt.show()

更优实现方法

针对这种按分组命名的列结构,推荐用分组列名直接调用的方式,逻辑更清晰,可读性更强:

# 提取所有分组名称(自动识别M1、M2)
groups = list(set(col.split('_')[0] for col in df_scales.columns))

for group in groups:
    x_col = f'{group}_x'
    y_col = f'{group}_y'
    plt.plot(df_scales[x_col], df_scales[y_col], marker='o', label=group)

plt.legend()
plt.xlabel('X值')
plt.ylabel('Y值')
plt.show()

如果后续分组数量增加(比如新增M3、M4),这种方法无需修改循环逻辑,会自动适配所有分组。

复杂场景优化:重塑为长格式DataFrame

若列数较多或需要更灵活的数据分析,可先将宽表转为长表,再分组绘图:

# 宽表转长表,拆分分组和x/y标识
df_long = df_scales.melt(var_name='group_xy', value_name='value')
df_long[['group', 'xy']] = df_long['group_xy'].str.split('_', expand=True)

# 重新透视回分组x/y结构
df_pivot = df_long.pivot(index=df_long.index, columns=['group', 'xy'], values='value')

# 遍历每个分组绘图
for group in df_pivot.columns.get_level_values(0).unique():
    plt.plot(df_pivot[group]['x'], df_pivot[group]['y'], marker='o', label=group)

plt.legend()
plt.xlabel('X值')
plt.ylabel('Y值')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:19