DataFrame切片问题:保留前两列报错及子图分栏需求
问题解决与实现方案
一、搞定保留前两列的KeyError问题
你写的df2=df.loc[:, df['16.3.9']]会报错,核心原因是df['16.3.9']返回的是这一列的数值Series,而loc的列参数需要的是列名、列名列表或者布尔索引,不是列的具体数值内容——程序会把这些数值当成要找的列名,自然找不到就报错了。
要保留前两列,有两种简单靠谱的写法:
- 用位置索引
iloc(适合不知道列名的情况):
df2 = df.iloc[:, :2] # 冒号前代表保留所有行,冒号后代表取前2列
- 直接指定列名列表(适合明确知道前两列名称的情况):
df2 = df.loc[:, ['2.3.6', '16.3.9']] # 精准指定要保留的列名
二、切片后生成每张占2列的多张子图
当然可以实现!下面给你一个基于matplotlib的实操示例,思路是把DataFrame按每2列分成一组,为每组单独绘制子图:
示例代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 模拟你的DataFrame结构(替换成你自己的df即可) data = { '2.3.6': [1, 3, 5, 7], '16.3.9': [2, 4, 6, 8], '9.2.7': [5, 3, 1, 2], '4.5.1': [8, 6, 4, 2] } df = pd.DataFrame(data, index=['August', 'September', 'October', 'November']) # 计算子图行数:总列数除以2后向上取整 total_cols = df.shape[1] rows = np.ceil(total_cols / 2).astype(int) # 创建子图布局 fig, axes = plt.subplots(nrows=rows, ncols=1, figsize=(10, 6*rows)) axes = axes.flatten() # 把多维子图数组转成一维,方便循环处理 # 按每2列分组,循环绘制子图 for i in range(0, total_cols, 2): cols_group = df.columns[i:i+2] ax = axes[i//2] df[cols_group].plot(kind='line', ax=ax, marker='o') # 这里用折线图,可换成柱状图等 ax.set_title(f'Columns: {", ".join(cols_group)}') ax.set_xlabel('Month') ax.legend() plt.tight_layout() # 自动调整子图间距,避免元素重叠 plt.show()
代码说明
- 先根据总列数计算需要多少张子图,确保每2列对应一张图;
- 用
flatten()处理子图数组,避免多维索引的麻烦; - 循环时每次截取2列数据,在对应子图上绘制,你可以根据需求替换绘图类型(比如
kind='bar'画柱状图); tight_layout()能自动优化子图布局,让标题、标签不会互相遮挡。
内容的提问来源于stack exchange,提问作者Bode
相关产品推荐
相关产品推荐

