如何解决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
相关产品推荐
相关产品推荐

