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

使用pandas读取xlsx生成频率表出现KeyError: 'B2:B57001;'如何解决

错误原因

你触发KeyError是因为pandas.DataFrame的[]取值语法默认按列名匹配,不能直接传入Excel的单元格范围字符串,你写的B2:B57001;不是DataFrame中存在的列名,所以直接报错。

修复方案

你明确说明文件仅包含一列年龄数据,推荐两种可行写法:

方案1:读取文件时直接指定范围(更高效)

直接在read_excel阶段就指定读取的列、跳过的行,避免后续多余处理,修正后代码如下:

import pandas as pd
import openpyxl

# 读取时指定只取B列,跳过第一行(从B2开始读),不把第一行设为表头
df = pd.read_excel(
    '/run/media/soumi/Luna (HDD)/CF-0001/PSHS/Statistics/Module 1/SLG 3.0 Data set 3.1 DOH COVID Data Drop Case Information.xlsx',
    usecols='B',
    skiprows=1,
    header=None
)
num = df.squeeze().tolist()

num.sort() 
print(f'\n{num}')

fdt = pd.Series(num).value_counts().sort_index().reset_index(drop=True)
fdt = fdt.rename_axis('Element').reset_index(name='Frequency')
print(fdt)

方案2:读取全表后按位置取数

如果你已经读取了全表,要对应取B2到B57001的区域,可以用iloc按索引取数(pandas的行、列索引都从0开始计数):

# 原读取代码不变
df = pd.read_excel('/run/media/soumi/Luna (HDD)/CF-0001/PSHS/Statistics/Module 1/SLG 3.0 Data set 3.1 DOH COVID Data Drop Case Information.xlsx')
# B列是第2列,对应索引1;B2是第2行,对应索引1,B57001对应索引57000
num = df.iloc[1:57000, 1].tolist()
# 后续代码和你原来的逻辑保持一致即可

注意事项

  • 你原代码里单元格范围末尾的;是多余的,Excel范围写法里没有这个符号
  • 如果你的B列第一行就是列名(比如列名是年龄),可以不用加skiprows和header=None,直接用df['年龄'].tolist()取数就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:45:04