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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:14:56