使用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
相关产品推荐
相关产品推荐

