如何用Pandas实现DataFrame条件过滤生成两个目标数据集
Pandas DataFrame双需求实现方案
问题背景
现有Pandas DataFrame(命名为df),包含Store、Date、Question、Answer四列。其中主问题为A、E、G、C,对应的子问题分别是B、F、H、D。需要完成两个任务:
- 提取子问题
Answer为空的记录,生成null_df,仅保留Store、Date、Question列; - 提取同一
Store和Date下,主问题Answer为"Yes"但未找到对应子问题的记录,生成df_check。
1. 生成null_df
先明确所有子问题范围,再筛选符合条件的行并保留指定列:
# 定义主问题-子问题映射关系 main_sub_map = {'A': 'B', 'E': 'F', 'G': 'H', 'C': 'D'} # 提取所有子问题 sub_questions = set(main_sub_map.values()) # 筛选子问题且Answer为空的记录,保留指定列 null_df = df[(df['Question'].isin(sub_questions)) & (df['Answer'].isna())][['Store', 'Date', 'Question']]
说明:
- 用映射字典的
values()获取所有子问题,集合存储能提高匹配效率; - 双重条件筛选:
Question属于子问题集合,且Answer为空; - 直接通过列索引保留需要的三列。
2. 生成df_check
先定位主问题回答为"Yes"的记录,再校验对应子问题是否存在:
# 1. 筛选主问题且Answer为"Yes"的记录,复制避免修改原数据 main_yes_df = df[(df['Question'].isin(main_sub_map.keys())) & (df['Answer'] == 'Yes')].copy() # 2. 为每条主问题记录添加对应的预期子问题 main_yes_df['Expected_Sub'] = main_yes_df['Question'].map(main_sub_map) # 3. 构建原数据中(Store, Date, Question)的唯一组合集合,用于快速查询 existing_pairs = set(df[['Store', 'Date', 'Question']].itertuples(index=False, name=None)) # 4. 筛选出预期子问题不存在的记录 missing_sub_mask = main_yes_df.apply( lambda row: (row['Store'], row['Date'], row['Expected_Sub']) not in existing_pairs, axis=1 ) # 5. 生成df_check,保留指定列 df_check = main_yes_df[missing_sub_mask][['Store', 'Date', 'Question']]
说明:
- 步骤1筛选出主问题且回答为"Yes"的记录,
copy()避免后续操作修改原DataFrame; - 步骤2通过
map()将每条主问题记录映射到对应子问题; - 步骤3把原数据中存在的(门店、日期、问题)组合存入集合,集合查询效率远高于逐行匹配;
- 步骤4用
apply()逐行检查预期子问题是否存在,生成布尔掩码; - 最后通过掩码筛选符合条件的记录,保留需要的三列。
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

