基于多行条件过滤议会法案数据:剔除含两个Yes的案例
议会法案数据过滤的优雅实现方案
方法1:分组直接过滤(无需辅助DataFrame)
- 核心逻辑:按法案名称分组后,直接在分组内统计"Yes"出现次数,同时限定仅保留法案A且次数不等于2的记录
- 代码实现:
import pandas as pd # 假设原数据包含列:`法案名称`、`事件结果` filtered_data = df.groupby('法案名称').filter( lambda group: (group['事件结果'].eq('Yes').sum() != 2) and (group.name == '法案A') )
- 优势:无需生成额外统计表,直接在分组操作中完成筛选,代码紧凑直观。
方法2:transform+布尔索引组合筛选
- 核心逻辑:用
transform将分组统计的"Yes"次数映射回每一行,再通过布尔索引直接筛选目标数据 - 代码实现:
# 为每一行添加对应法案的Yes出现次数 df['yes_count'] = df['事件结果'].eq('Yes').groupby(df['法案名称']).transform('sum') # 筛选符合条件的记录 filtered_data = df[(df['法案名称'] == '法案A') & (df['yes_count'] != 2)].drop('yes_count', axis=1)
- 优势:逻辑清晰,
transform避免了分组后合并的繁琐步骤,直接完成结果映射,性能更优。
方法3:链式调用精简写法
- 核心逻辑:通过链式调用整合计算、筛选、清理步骤,全程无额外中间变量
- 代码实现:
filtered_data = (df .assign(yes_count=lambda x: x['事件结果'].eq('Yes').groupby(x['法案名称']).transform('sum')) .query('法案名称 == "法案A" and yes_count != 2') .drop('yes_count', axis=1) )
- 优势:符合pandas惯用的链式风格,代码可读性强,无需分散的变量操作。
内容的提问来源于stack exchange,提问作者Nick Glättli
相关产品推荐
相关产品推荐

