pandas获取指定国家对应result列非NaN值及筛选报错解决
问题原因
代码不生效的核心问题是loc的列索引参数传入错误:你传入的是变量country的值(比如UK),但你的DataFrame中不存在名为UK的列,你需要提取的是result列的数值,所以列索引位置应该传入'result'而不是country。
基础实现(仅过滤非空值)
首先确保已经导入依赖库:
import pandas as pd import numpy as np
单个国家查询实现:
country = 'UK' mask_country = df['country'] == country mask_result = df['result'].notnull() # 正确写法,取result列后转列表 result_list = df.loc[mask_country & mask_result, 'result'].tolist() print(result_list) # 输出 ['A', 'B']
如果需要批量获取所有国家的对应结果,可以直接用groupby聚合:
all_country_res = df.dropna(subset=['result']).groupby('country')['result'].agg(list).to_dict() print(all_country_res) # 输出 {'UK': ['A', 'B'], 'US': ['C', 'D', 4]}
补充需求实现(保留非空、非空格的字符串类型值)
新增自定义校验规则过滤即可:
def filter_valid_val(x): # 仅保留非空、非全空格的字符串类型值 return isinstance(x, str) and x.strip() != '' # 单个国家查询 country = 'US' mask_country = df['country'] == country mask_valid = df['result'].apply(filter_valid_val) result_list = df.loc[mask_country & mask_valid, 'result'].tolist() print(result_list) # 输出 ['C', 'D'],数值类型的4会被过滤
批量获取所有国家的合规结果:
all_valid_res = df[df['result'].apply(filter_valid_val)].groupby('country')['result'].agg(list).to_dict() print(all_valid_res) # 输出 {'UK': ['A', 'B'], 'US': ['C', 'D']}
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

