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

如何筛选出属于拥有10匹以上马匹的马厩的DataFrame记录?

问题:过滤马匹数据库中马匹数量≥10的马厩记录

我有一个简化的马匹数据库DataFrame,包含horse_name和stable_name列。希望过滤掉马匹数量少于10的小型马厩,仅保留拥有10匹以上马匹的马厩的记录,但尝试多种方法均出现KeyError错误。

错误原因分析

  • 尝试1、2的核心问题:df['stable_name'].value_counts()返回的是一个以马厩名称为索引的Series,直接将其作为df[]的筛选条件时,Pandas会把这个Series的索引当作df的列名去查找,但你的df只有horse_name和stable_name两列,因此触发KeyError。
  • 尝试3的问题:Python原生的in运算符不支持Pandas Series的元素级判断,且df['Stable'] in df['Stable'].value_counts() >10的逻辑完全不符合Pandas的向量化操作规则,无法正确筛选。

正确实现方法

方法1:使用groupby + filter(最直观)

# 按马厩分组,仅保留组内马匹数量≥10的所有原始记录
filtered_df = df.groupby('stable_name').filter(lambda x: len(x) >= 10)

filter方法会自动保留满足条件(组内记录数≥10)的所有行,无需额外处理索引或列表。

方法2:使用value_counts + isin

# 第一步:提取马匹数量≥10的马厩名称列表
valid_stables = df['stable_name'].value_counts()[df['stable_name'].value_counts() >= 10].index.tolist()
# 第二步:筛选df中属于有效马厩的记录
filtered_df = df[df['stable_name'].isin(valid_stables)]

先通过value_counts()筛选出符合条件的马厩,再用isin()判断每行的马厩是否在有效列表中。

方法3:使用transform + 布尔索引

# 给每行添加对应马厩的马匹数量(临时列)
df['stable_count'] = df.groupby('stable_name')['stable_name'].transform('count')
# 筛选马匹数量≥10的行,最后删除临时列
filtered_df = df[df['stable_count'] >= 10].drop(columns='stable_count')

transform('count')会将每个马厩的马匹数量广播到该马厩的每一行,之后直接按数量筛选即可。

内容的提问来源于stack exchange,提问作者lushyplushy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:16:10