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

如何用Pandas实现DataFrame条件过滤生成两个目标数据集

Pandas DataFrame双需求实现方案

问题背景

现有Pandas DataFrame(命名为df),包含Store、Date、Question、Answer四列。其中主问题为A、E、G、C,对应的子问题分别是B、F、H、D。需要完成两个任务:

  1. 提取子问题Answer为空的记录,生成null_df,仅保留Store、Date、Question列;
  2. 提取同一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:05:16