【问题标题】:drop group by number of occurrence按出现次数分组
【发布时间】:2018-11-25 20:06:13
【问题描述】:

您好,我想删除出现次数小于数字的条目的行,例如:

df = pd.DataFrame({'a': [1,2,3,2], 'b':[4,5,6,7], 'c':[0,1,3,2]})
df
   a  b  c
0  1  4  0
1  2  5  1
2  3  6  3
3  2  7  2

如果“a”列中出现的次数少于两次,我想删除所有行。
想要的输出:

   a  b  c
1  2  5  1
3  2  7  2

我知道的: 我们可以通过condition = df['a'].value_counts() < 2 找到出现次数,它会给我如下信息:

2    False
3    True
1    True
Name: a, dtype: int64

但我不知道应该如何从这里删除行。
提前致谢!

【问题讨论】:

    标签: python pandas dataframe counter pandas-groupby


    【解决方案1】:

    groupby + size

    res = df[df.groupby('a')['b'].transform('size') >= 2]
    

    transform 方法将 df.groupby('a')['b'].size() 映射到与 df['a'] 对齐的 df

    value_counts + map

    s = df['a'].value_counts()
    res = df[df['a'].map(s) >= 2]
    
    print(res)
    
       a  b  c
    1  2  5  1
    3  2  7  2
    

    【讨论】:

      【解决方案2】:

      您可以使用df.wheredropna

      df.where(df['a'].value_counts() <2).dropna()
      
           a   b   c
      1   2.0 5.0 1.0
      3   2.0 7.0 2.0
      

      【讨论】:

        【解决方案3】:

        您可以尝试这样的方法来获取每个组的长度,转换回原始索引并通过它索引 df

        df[df.groupby("a").transform(len)["b"] >= 2]
        
        
            a   b   c
        1   2   5   1
        3   2   7   2
        

        将其分解为您获得的各个步骤:

        df.groupby("a").transform(len)["b"]
        
        0    1
        1    2
        2    1
        3    2
        Name: b, dtype: int64
        

        这些是转换回原始索引的组大小

        df.groupby("a").transform(len)["b"] >=2
        
        0    False
        1     True
        2    False
        3     True
        Name: b, dtype: bool
        

        然后我们将其转换为布尔索引并通过它索引我们的原始数据帧

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-10
          • 2020-10-02
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          • 2020-03-03
          • 2020-07-05
          • 2019-04-25
          相关资源
          最近更新 更多