Pandas代码执行触发KeyError:1错误,请求技术解决方案
解决Pandas代码中的KeyError: 1问题
嘿,我来帮你搞定这个KeyError问题!首先,KeyError: 1的意思很明确——你的代码尝试访问DataFrame的列1,但这个列根本不存在。我们来一步步排查原因并修复:
问题根源分析
看你这段核心代码:
my_ratings = pd.DataFrame.from_records(worksheet.get_all_values()).reset_index() my_ratings = my_ratings[my_ratings[1] != '']
这里的核心问题是:worksheet.get_all_values()返回的数据结构和你预期的不一样。可能的情况有两种:
- 你的工作表第一行是表头(比如"歌曲名"、"播放次数"),但你直接把所有内容转成了数据行,导致DataFrame的列名变成了表头文本,而不是数字索引0、1,这时候访问
my_ratings[1]自然会报错。 - 工作表里的某些行只有1列数据,或者
get_all_values()返回的列表本身就只有1列,根本没有索引为1的列。
分步解决方案
第一步:先确认数据结构
在创建DataFrame之前,先打印worksheet.get_all_values()的输出,看看实际数据是什么样的:
print("工作表原始数据:", worksheet.get_all_values())
这能帮你明确:数据有没有表头?每行有几列?
第二步:根据数据结构调整代码
情况1:工作表有表头(第一行是列名)
如果输出里第一行是类似["Title", "Listen Count"]这样的表头,那你需要把表头单独提取出来作为列名,不要和数据混在一起:
# 提取所有数据 data = worksheet.get_all_values() # 用第一行做列名,从第二行开始加载数据 my_ratings = pd.DataFrame(data[1:], columns=data[0]).reset_index() # 过滤空的播放次数(这里用表头里的列名,比如"Listen Count") my_ratings = my_ratings[my_ratings["Listen Count"] != ''] # 构造目标DataFrame时用对应的列名 my_ratings = pd.DataFrame({ 'user_id': "943", 'title': list(map(str, my_ratings["Title"])), 'listen_count': list(map(float, my_ratings["Listen Count"])) })
情况2:工作表没有表头,纯数据行
如果输出里每行都是两列数据(比如["歌曲A", "5"]),那先过滤掉长度不足2的行,再明确指定列名:
data = worksheet.get_all_values() # 过滤掉只有1列的无效行 valid_data = [row for row in data if len(row) >= 2] # 明确指定列名,避免用数字索引混淆 my_ratings = pd.DataFrame(valid_data, columns=["title", "listen_count"]).reset_index() # 过滤空的播放次数 my_ratings = my_ratings[my_ratings["listen_count"] != ''] # 构造目标DataFrame my_ratings = pd.DataFrame({ 'user_id': "943", 'title': list(map(str, my_ratings["title"])), 'listen_count': list(map(float, my_ratings["listen_count"])) })
第三步:修复代码里的其他小问题
除了KeyError,你的代码还有两个需要注意的点:
- 合并操作没有赋值:
my_ratings.merge(song_df_2, on="title", how="left")这行执行后结果没保存,应该改成:my_ratings = my_ratings.merge(song_df_2, on="title", how="left") append()方法已弃用:Pandas 2.0+已经不再推荐用append(),建议换成pd.concat():# 替换song_df.append(...) song_df = pd.concat([song_df, my_ratings], ignore_index=True) # 替换users.append(...) if users.shape[0] == 943: new_user = users.iloc[942].copy() new_user["user_id"] = "943" users = pd.concat([users, pd.DataFrame([new_user])], ignore_index=True)
最后验证
修改完代码后,你可以打印my_ratings.columns看看列名是否正确,确保不会再出现KeyError。
内容的提问来源于stack exchange,提问作者Nikhil Vijay




