如何为Pandas DataFrame添加多维列并实现分数条件查询?
解决方案
1. 构建REF分数映射字典
先把ref_df转换成字典,实现快速查找REF对应的分数,避免重复查询DataFrame:
# 构建REF名称到分数的映射字典 ref_score_map = ref_df.set_index('NAME')['SCORE'].to_dict()
2. 生成包含REF_INFO的merged_df
定义处理函数,兼容REF列的三种类型(列表、None、单个字符串),生成对应的名称-分数映射:
def parse_ref_info(ref_value): if ref_value is None: return {} # 统一转为列表处理,不管输入是单个值还是已有列表 ref_list = [ref_value] if isinstance(ref_value, str) else ref_value # 过滤不在映射字典中的REF,避免KeyError return {ref: ref_score_map[ref] for ref in ref_list if ref in ref_score_map} # 复制原DataFrame并添加REF_INFO列 merged_df = issue_df.copy() merged_df['REF_INFO'] = merged_df['REF'].apply(parse_ref_info)
处理后merged_df的REF_INFO列会存储对应{REF名称: 分数}的字典,例如第一行结果为{'REF1': 100.0, 'REF2': 99.0},空REF对应空字典。
3. 查询分数低于指定值的行
设定阈值后,筛选出REF_INFO中存在分数低于阈值的行:
threshold = 90 # 筛选条件:REF_INFO中至少有一个分数小于阈值 filtered_df = merged_df[merged_df['REF_INFO'].apply(lambda x: any(score < threshold for score in x.values()))]
完整可运行代码
import pandas as pd issue_data = { 'COL1': ['Name1', 'Name2', 'Name3', 'Name4'], 'COL2': ['Val1', 'Val2', 'Val3', 'Val4'], 'REF': [['REF1', 'REF2'], None, ['REF1', 'REF2', 'REF3'], 'REF2']} ref_data = { 'NAME': ['REF1', 'REF2', 'REF3'], 'SCORE': [100.0, 99.0, 85.0]} issue_df = pd.DataFrame(issue_data) ref_df = pd.DataFrame(ref_data) # 构建REF分数映射字典 ref_score_map = ref_df.set_index('NAME')['SCORE'].to_dict() # 处理REF列生成REF_INFO def parse_ref_info(ref_value): if ref_value is None: return {} ref_list = [ref_value] if isinstance(ref_value, str) else ref_value return {ref: ref_score_map[ref] for ref in ref_list if ref in ref_score_map} merged_df = issue_df.copy() merged_df['REF_INFO'] = merged_df['REF'].apply(parse_ref_info) # 查询分数低于指定值的行 threshold = 90 filtered_df = merged_df[merged_df['REF_INFO'].apply(lambda x: any(score < threshold for score in x.values()))] print("合并后的DataFrame:") print(merged_df) print("\n分数低于{}的行:".format(threshold)) print(filtered_df)
内容的提问来源于stack exchange,提问作者Peregrin5
相关产品推荐
相关产品推荐

