如何批量删除Pandas DataFrame中出现次数不足4次的城市行?
解决Pandas DataFrame按列值出现次数过滤的问题
嘿,这个需求太常见了,我来给你几个高效的实现方法,完全不用手动逐个删除目标城市的行:
方法一:用value_counts + isin组合
先筛选出出现次数≥4的城市列表,再保留这些城市的行:
# 获取出现次数≥4的城市名称 cities_to_keep = df['city'].value_counts()[df['city'].value_counts() >= 4].index # 过滤DataFrame filtered_df = df[df['city'].isin(cities_to_keep)]
原理很简单:value_counts()返回各城市的出现次数,我们筛选出计数≥4的条目,取它们的索引(也就是城市名),再用isin()保留这些城市对应的所有行。
方法二:用groupby + filter(最简洁)
这是我个人最常用的写法,一行就能搞定:
filtered_df = df.groupby('city').filter(lambda x: len(x) >= 4)
groupby('city')把数据按城市分组,filter()会对每个组执行lambda函数——检查组的长度(也就是该城市的出现次数)是否≥4,只有符合条件的组会被保留下来。
方法三:用transform计算每行的组计数
如果你需要先查看每个行对应的城市出现次数,或者想更直观地理解筛选逻辑,可以用transform:
# 给每行添加对应城市的出现次数列 df['city_count'] = df.groupby('city')['city'].transform('count') # 筛选出次数≥4的行,再删掉临时列 filtered_df = df[df['city_count'] >= 4].drop('city_count', axis=1)
或者更紧凑的一行写法:
filtered_df = df[df.groupby('city')['city'].transform('count') >= 4]
transform('count')会把每个组的计数广播到组内的每一行,这样我们直接对这个广播后的计数列做筛选即可。
这三种方法都能自动识别所有出现次数≥4的城市,完全不用手动指定城市名,不管你的城市列表有多长都能适用~
内容的提问来源于stack exchange,提问作者Devin Lee
相关产品推荐
相关产品推荐

