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

使用transform()/apply()后出现KeyError(key) in get_loc_level的修复需求

解决分组过滤时的KeyError问题

我懂你的困扰——大部分场景下代码能正常跑,但遇到没有对应Country_2记录的分组时就炸出KeyError,还不想大改现有逻辑对吧?给你个简单的修复方案,完全贴合你的需求。

问题根源

你的Country_2_gr只包含Second_country_available=True的分组,而transform遍历所有分组时,那些没有对应Country_2记录的分组(比如示例里的(1, 'A15', '2012')),用g.name去取Country_2_gr的值时自然找不到键,直接抛出KeyError。

修复方案

只需要修改transform里的lambda函数,用get方法安全获取Country_2_gr的值,当分组键不存在时返回一个不会匹配任何Country值的默认值(比如空字符串),这样这些分组的行就会被标记为False,后续过滤时自动丢弃。

修改后的完整代码:

import pandas as pd

data2 = {"Year":["2012","2012","2012","2012","2012","2012","2012","2012","2012"],
        "Country":['USA','USA','USA','USA','USA','USA','USA','CANADA','CANADA'],
         "Country_2": ["", "", "", "", "", "", "", "USA", "USA"],
        "ID":["AF12","A15","BU14","DU157","L12","N10","RU156","DU157","RU156"],
         "Detail":[1,1,1,1,1,1,1,1,1],
         "Second_country_available":[False,False,False,False,False,False,False,True,True],
        }
df5 = pd.DataFrame(data2)
df5_true = df5["Second_country_available"] == True
Country_2_gr = df5[df5_true].groupby(["Detail", "ID", "Year"])['Country_2'].agg(
            '|'.join)

grouped_df5 = df5.groupby(["Detail", "ID", "Year"], group_keys=False)['Country']
# 用get方法处理不存在的分组键,避免KeyError
filtered = grouped_df5.transform(lambda g: g.str.fullmatch(Country_2_gr.get(g.name, '')))

# 过滤出符合条件的行
result = df5[filtered]
print(result)

为什么这个方案有效

  • Country_2_gr.get(g.name, ''):当分组键存在时返回对应的Country_2拼接值,不存在时返回空字符串
  • g.str.fullmatch(''):你的Country列里没有空字符串,所以这些行都会返回False,后续用df5[filtered]就能自动丢弃这些分组的所有行
  • 完全保留了你原来的核心逻辑,只是加了一层安全获取的处理,没有大幅改动代码

如果你想更明确地标记不存在的分组,也可以改成下面这种写法(效果一致,可读性更强):

filtered = grouped_df5.transform(
    lambda g: g.str.fullmatch(Country_2_gr[g.name]) if g.name in Country_2_gr.index else False
)

这样运行后就不会再出现KeyError,那些没有对应Country_2记录的分组会被自动过滤掉啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:40:39