Pandas DataFrame分组后按组规模规则删除指定行
解决方案
可以通过Pandas的矢量化分组操作实现,避免循环遍历每个组,保证处理大数据集时的效率:
核心思路
- 计算每个分组的行数,关联到每一行;
- 用组内正向/反向计数标记每行在组内的位置;
- 根据组大小和行位置构建过滤条件,筛选需要保留的行。
代码实现
import pandas as pd # 示例数据 df = pd.DataFrame({ 'group_col': ['A', 'A', 'A', 'B', 'B', 'C'], 'value': [1, 2, 3, 4, 5, 6] }) n = 3 # 自定义阈值 # 1. 计算每个行所属分组的大小 group_size = df.groupby('group_col')['group_col'].transform('size') # 2. 组内正向索引(从0开始,第一行索引为0) cum_count = df.groupby('group_col').cumcount() # 3. 组内反向索引(从0开始,最后一行索引为0) cum_count_rev = df.groupby('group_col').cumcount(ascending=False) # 构建过滤掩码:符合条件的行保留 mask = ( # 分组行数 <n:保留除第一行外的所有行 ((group_size < n) & (cum_count != 0)) | # 分组行数 >=n:保留除第一行和最后一行外的所有行 ((group_size >= n) & (cum_count != 0) & (cum_count_rev != 0)) ) # 得到最终结果 result_df = df[mask]
关键说明
- 所有操作都是Pandas内置的矢量化方法,比
apply循环遍历分组的效率高一个数量级,适合处理百万级以上的数据集; - 如果需要按多列分组,只需将
groupby('group_col')改为groupby(['col1', 'col2'])即可; - 阈值
n可根据需求自定义,无需修改核心逻辑。
内容的提问来源于stack exchange,提问作者Yandle
相关产品推荐
相关产品推荐

