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

如何解决Pandas循环调用自定义函数时出现的KeyError问题

解决Select_Warhouse函数在主循环中触发KeyError: 0的问题

错误根源

你遇到的KeyError: 0是因为函数里硬编码使用df.loc[0, col_name]按索引标签取行,但主循环中while len(df) > 0的逻辑应该是在不断移除已处理的行(比如用drop),导致当前传入函数的select(或是循环中的df)的索引已经没有0这个标签了。而单独测试时用的是原始完整df,索引包含0,所以不会报错。

修复方案

有两种直接的解决方式:

方式1:改用位置索引iloc(推荐)

不需要依赖索引标签,直接取DataFrame的第一行数据,不管当前索引是什么:

def Select_Warehouse(df, li):
    # Initialize variables
    min_col = None
    min_val = float('inf')
    results = []

    # Loop over dictionaries
    for dict_item in li:
        for key in dict_item.keys():
            # Check if key is a partial match with any column name
            matching_col = [col for col in df.columns if key in col]
            if matching_col:
                # Retrieve column name and value
                col_name = matching_col[0]
                # 改用iloc按位置取第一行,替代loc按索引标签取
                col_val = df[col_name].iloc[0]
                results.append((col_name, col_val))
                # Update minimum value if necessary
                if col_val < min_val:
                    min_col = col_name
                    min_val = col_val
    output = [el for el in li if list(el.keys())[0] in min_col.split()[0]]
    return str(*output[0].keys())

方式2:循环中重置df的索引

如果一定要保留loc[0]的写法,可以在主循环每次移除行后,重置df的索引:

while len(df) > 0:
    ...
    # 处理完一行后执行重置索引
    df = df.reset_index(drop=True)
    ...
    elif len(Available_Warehouses) > 1:
        Warehouse = Select_Warehouse(select, Available_Warehouses)
    ...

注意如果select是df的子集,也要给它重置索引:select = select.reset_index(drop=True)

额外优化建议

  • 你的matching_col逻辑是找包含key的列名,假设每个key只会匹配到一列(比如Warehouse1对应Warehouse1 Distance...),如果后续列名有变化可能出现多匹配的情况,可以加个判断确保只取一个:if len(matching_col) == 1
  • 函数名拼写错误:Select_Warhouse应该修正为Select_Warehouse(少了一个字母e),避免后续调用时出现拼写问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:57:50