如何筛选出属于拥有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
相关产品推荐
相关产品推荐

