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

Pandas分组应用自定义函数出现KeyError:0的问题求助

问题排查与解决

报错根本原因

KeyError:0 本质是分组后使用apply返回列表时,Pandas会自动将列表封装成索引从0开始的Series,但这个新Series的索引无法和原DataFrame的原始索引(比如0,1,2...)对齐,导致匹配失败抛出错误。此外,如果你的自定义函数f严格要求输入是列表,但分组后apply实际传入的是Series,函数内部若按列表索引(如featureList[0])访问,也会因为Series的索引不是0-based而触发该错误。

三种解决方法

方法1:改用transform替代apply

transform专门用于分组后生成与原DataFrame同长度的结果,会自动对齐索引,无需手动处理索引问题。只需确保函数f能接收Series(或自动转为列表)并返回同长度的列表/Series即可。

示例代码:

import pandas as pd

# 自定义函数示例(可替换为你的复杂逻辑)
def f(input_data):
    # 统一将输入转为列表处理
    feature_list = input_data.tolist() if hasattr(input_data, 'tolist') else input_data
    # 你的复杂处理逻辑,返回同长度列表
    return [x + max(feature_list) for x in feature_list]

# 测试DataFrame
df = pd.DataFrame({
    'Class_ID': [1,1,2,2,2],
    'feature': [10,20,30,40,50]
})

# 生成新列
df['New_feature'] = df.groupby('Class_ID')['feature'].transform(f)

方法2:修改函数返回带原索引的Series

如果坚持使用apply,可以让函数接收分组后的Series,处理后返回与原Series索引一致的Series,确保合并时索引匹配。

示例代码:

def f(feature_series):
    feature_list = feature_series.tolist()
    # 你的复杂处理逻辑
    result_list = [x + max(feature_list) for x in feature_list]
    # 返回带原索引的Series
    return pd.Series(result_list, index=feature_series.index)

df['New_feature'] = df.groupby('Class_ID', group_keys=False)['feature'].apply(f)

方法3:兼容函数的输入类型

如果不想修改apply或transform的用法,可在函数内部先将输入转为列表,避免因传入Series导致的索引访问错误。

示例代码:

def f(feature_data):
    # 自动判断输入类型并转为列表
    if isinstance(feature_data, pd.Series):
        feature_list = feature_data.tolist()
    else:
        feature_list = feature_data
    # 你的复杂处理逻辑
    result_list = [x + max(feature_list) for x in feature_list]
    return result_list

# 配合transform使用
df['New_feature'] = df.groupby('Class_ID')['feature'].transform(f)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:04:57