You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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()返回的数据结构和你预期的不一样。可能的情况有两种:

  1. 你的工作表第一行是表头(比如"歌曲名"、"播放次数"),但你直接把所有内容转成了数据行,导致DataFrame的列名变成了表头文本,而不是数字索引0、1,这时候访问my_ratings[1]自然会报错。
  2. 工作表里的某些行只有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,你的代码还有两个需要注意的点:

  1. 合并操作没有赋值my_ratings.merge(song_df_2, on="title", how="left")这行执行后结果没保存,应该改成:
    my_ratings = my_ratings.merge(song_df_2, on="title", how="left")
    
  2. 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

火山引擎 最新活动