DataFrame多条件查询函数空值报错问题及解决方案咨询
解决Pandas多条件查询空DataFrame导致的报错问题
问题核心
当查询年份无匹配数据时,df.loc返回空DataFrame,直接调用.values[0]会触发索引越界错误;后续空列表求和后进行除法运算也会引发异常。以下是针对性的修复方案:
修复步骤与代码优化
1. 先判断切片是否为空,避免索引越界
空DataFrame的empty属性为True,这是判断是否有数据的可靠方式,替代无效的is not None判断。
2. 优化国家存在性检查
用精确匹配替代str.contains,避免因国家名称部分匹配导致的错误(比如"America"误匹配"South America")。
3. 处理无数据场景的分支逻辑
当目标年份无任何有效数据时,直接给出提示并终止函数,避免后续运算报错。
修改后的完整代码
import pandas as pd mm_df = pd.read_csv("mm_copy.csv", index_col=False, low_memory=False) countries_df = pd.read_csv("countries.csv") south_america_df = countries_df.loc[countries_df.Continent == "South America"] south_american_countries_list = south_america_df.Entity.tolist() population_df = pd.read_csv("population.csv", low_memory=False) # 修复原代码set_index未赋值的问题 population_df = population_df.set_index("Location") def calculate_crude_maternal_mortality(year): # 检查南美整体女性人口数据是否存在 who_female_pop_slice = population_df.loc[(population_df.Location == "South America") & (population_df.Time == year)] if who_female_pop_slice.empty: print(f"年份{year}无南美整体人口数据,无法计算死亡率") return who_female_pop = who_female_pop_slice["TPopulationFemale1July"].values[0] * 1000 south_american_female_pop_list = [] south_american_mm_deaths_list = [] mm_dict_for_year = {} for country in south_american_countries_list: mm_dict_value_list = [] # 精确检查国家是否在孕产妇死亡数据中 if country in mm_df["Country_Name"].unique(): mm_df_slice = mm_df.loc[ (mm_df.Country_Name == country) & (mm_df.Year == year) & (mm_df.Sex == "Female") & (mm_df.Age_group_code == "Age_all") ] # 判断切片是否有有效数据 if not mm_df_slice.empty: country_mm_deaths = int(mm_df_slice.Number.values[0]) mm_dict_value_list.append(country_mm_deaths) else: mm_dict_value_list.append("No data") else: mm_dict_value_list.append("No data") # 精确检查国家是否在人口数据中 if country in population_df["Location"].unique(): population_df_slice = population_df.loc[ (population_df.Location == country) & (population_df.Time == year) ] if not population_df_slice.empty: country_female_pop = int(population_df_slice["TPopulationFemale1July"].values[0] * 1000) mm_dict_value_list.append(country_female_pop) else: mm_dict_value_list.append("No data") else: mm_dict_value_list.append("No data") mm_dict_for_year[country] = mm_dict_value_list # 整理有效数据 for country in mm_dict_for_year: deaths = mm_dict_for_year[country][0] pop = mm_dict_for_year[country][1] if deaths != "No data" and pop != "No data": south_american_mm_deaths_list.append(deaths) south_american_female_pop_list.append(pop) # 处理无有效数据的情况 if not south_american_female_pop_list: print(f"年份{year}无足够的国家数据,无法计算死亡率") return # 计算覆盖率与死亡率 data_coverage_percentage = round((sum(south_american_female_pop_list) / who_female_pop) * 100, 2) crude_maternal_mortality_rate = round((sum(south_american_mm_deaths_list) / sum(south_american_female_pop_list)) * 100000, 2) print(f"Data coverage = {data_coverage_percentage}%") if data_coverage_percentage < 80: print("Coverage below threshold of 80%") else: print(f"{year}: Crude maternal mortality rate for all of South America was {crude_maternal_mortality_rate} per 100000 females, and data coverage was {data_coverage_percentage}%.") calculate_crude_maternal_mortality(1993)
关键修改点说明
- 修复了
population_df.set_index未赋值的问题,原代码中该操作未生效 - 所有切片操作后增加
empty判断,彻底避免索引越界错误 - 用
unique()+精确匹配替代str.contains,减少国家名称误判 - 增加多级无数据判断:先检查整体人口数据,再检查单个国家数据,最后检查有效数据列表是否为空
- 用f-string优化字符串格式化,提升代码可读性
内容的提问来源于stack exchange,提问作者Reptile Smile
相关产品推荐
相关产品推荐

