pandas读取Google Sheet搜索DataFrame返回空报索引越界错误
问题根因
匹配为空、后续索引越界的核心原因是Google Sheets API返回的单元格值默认全为字符串类型,和本地读取CSV的类型处理逻辑不一致:
- 本地用
pd.read_csv()读取文件时,pandas会自动识别列内容格式,把存纯数字的Alternate ID列转为整数类型,你将输入转为整数后匹配可以正常命中 - 通过Sheets API拉取到的
values是原生二维列表,所有单元格内容都保留字符串格式,哪怕内容是纯数字也不会自动转类型。你拿整数类型的搜索值和字符串类型的列值做相等判断,pandas会直接返回False,导致匹配结果为空数组,后续取第0个元素时就触发index 0 is out of bounds for axis 0 with size 0报错。
另外还有个容易踩的隐藏坑:Sheets API返回行数据时,如果行尾单元格为空,会直接截断列表长度,比如某行Actual Cost列是空值,返回的列表长度会比定义的列数少1,构造DataFrame时对应位置会自动补NaN,不做处理也容易触发类型错误。
修复方法
- 构造DataFrame后,显式将需要匹配、计算的数字列转为对应数值类型,不依赖自动类型推断
- 对匹配结果加非空判断,避免输入不存在的库存号时程序直接崩溃
修正后的核心代码段如下:
df = pd.DataFrame(values, columns = ['Location', 'Inv Status Code', 'Model #', 'Alternate ID', 'Serial #', 'Model Description', 'Actual Cost']) # 显式转换数字列类型,异常值/空值统一填充默认值,避免转类型报错 df['Alternate ID'] = pd.to_numeric(df['Alternate ID'], errors='coerce').fillna(0).astype(int) df['Actual Cost'] = pd.to_numeric(df['Actual Cost'], errors='coerce').fillna(0) # 获取用户输入 searchAlt = int(input("Stock Number: ").lstrip("0")) condition = int(input("Condition 1-10: ")) # 匹配前先判断结果是否存在 match_res = df.loc[df['Alternate ID'] == searchAlt, 'Actual Cost'] if match_res.empty: print(f"错误:未找到库存编号为{searchAlt}的对应记录,请检查输入") # 可在此处加退出逻辑,比如 exit() else: costi = match_res.values[0] # 后续定价计算、标签生成逻辑写在这里
如果改完仍存在匹配问题,可以先执行print(df.dtypes)确认Alternate ID列的类型为int32/int64,再打印print(type(df['Alternate ID'].iloc[0]), type(searchAlt))确认两边值的类型一致,即可排除类型不匹配导致的匹配失败问题。
内容的提问来源于stack exchange,提问作者Shane Bowe
相关产品推荐
相关产品推荐

