Python for循环数据类型适配:DataFrame列名绘图索引错误解决
解决DataFrame列名循环绘制散点图时axs索引报错的问题
核心问题原因
axs是matplotlib生成的子图数组,仅支持整数、切片等数值型索引,而你用字符串类型的列名去索引,必然触发IndexError。不需要修改y = DataImport.loc[:,col1]这行的逻辑,只需要把列名映射为对应的整数索引即可。
简洁解决方案
方法一:用enumerate同时获取整数索引和列名
直接在循环中同时拿到子图的整数索引和目标列名,是最直观的解决方式:
import matplotlib.pyplot as plt # 提取第一列作为x轴数据 x_data = DataImport.iloc[:, 0] # 创建21张子图,这里按7行3列排列,可按需调整布局 fig, axs = plt.subplots(7, 3, figsize=(16, 22)) # 将二维子图数组展平为一维,方便循环索引 axs = axs.flatten() # 遍历除第一列外的所有列,同时获取索引和列名 for idx, col_name in enumerate(DataImport.columns[1:]): # 获取当前列的y轴数据(原逻辑完全保留) y_data = DataImport.loc[:, col_name] # 用整数索引idx访问对应子图,绘制散点图 axs[idx].scatter(x_data, y_data) # 设置子图标题和坐标轴标签 axs[idx].set_title(f'{DataImport.columns[0]} vs {col_name}') axs[idx].set_xlabel(DataImport.columns[0]) axs[idx].set_ylabel(col_name) # 自动调整子图间距 plt.tight_layout() plt.show()
方法二:通过列名获取其在DataFrame中的位置索引
如果不想修改循环的迭代变量形式,可以用columns.get_loc()方法把列名转换成整数位置,再映射到子图索引:
import matplotlib.pyplot as plt x_data = DataImport.iloc[:, 0] fig, axs = plt.subplots(7, 3, figsize=(16, 22)) axs = axs.flatten() # 保持原循环逻辑,用列名作为迭代变量 for col_name in DataImport.columns[1:]: # 获取当前列在DataFrame中的位置,减去1对应子图数组的索引(跳过第一列) subplot_idx = DataImport.columns.get_loc(col_name) - 1 y_data = DataImport.loc[:, col_name] axs[subplot_idx].scatter(x_data, y_data) axs[subplot_idx].set_title(f'{DataImport.columns[0]} vs {col_name}') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Schieper
相关产品推荐
相关产品推荐

