代码之家  ›  专栏  ›  技术社区  ›  johnconnor92

筛选至少有一行满足条件的GroupBy对象

  •  5
  • johnconnor92  · 技术社区  · 7 年前

    假设有一个测试:

    test_df = pd.DataFrame({'Category': ['P', 'P', 'P', 'Q', 'Q', "Q"],
                        'Subcategory' : ['A', 'B', 'C', 'C', 'A', 'B'],
                        'Value' : [2.0, 5., 8., 1., 2., 1.]})
    

    这样做可以:

    test_df.groupby(['Category', 'Subcategory'])['Value'].sum()
    # Output is this
    Category  Subcategory
    P         A              2.0
              B              5.0
              C              8.0
    Q         A              2.0
              B              1.0
              C              1.0
    

    我要筛选子类别中至少有一个值大于或等于3的类别。也就是说,在当前测试中,Q将从过滤器中排除,因为它的任何行都不大于或等于3。但是,如果其中一行是5,那么Q将保留在过滤器中。

    我试过使用以下方法,但它过滤掉了类别“P”中的“A”子类别。

    test_df_grouped = test_df.groupby(['Category', 'Subcategory'])
    
    test_df_grouped.filter(lambda x: (x['Value'] > 2).any()).groupby(['Category', 'Subcategory'])['Value'].sum()
    

    2 回复  |  直到 7 年前
        1
  •  3
  •   user3483203    7 年前

    使用 loc :

    s = test_df.groupby(['Category', 'Subcategory'])['Value'].sum()
    s.loc[s[s.ge(3)].index.get_level_values(0).unique()].reset_index()
    

      Category Subcategory  Value
    0        P           A    2.0
    1        P           B    5.0
    2        P           C    8.0
    
        2
  •  3
  •   jezrael    7 年前

    使用:

    mask = (test_df['Category'].isin(test_df.loc[test_df['Value'] >= 3, 'Category'].unique())
    a = test_df[mask]
    print (a)
      Category Subcategory  Value
    0        P           A    2.0
    1        P           B    5.0
    2        P           C    8.0
    

    先得到全部 Category 条件值:

    print (test_df.loc[test_df['Value'] >= 3, 'Category'])
    1    P
    2    P
    Name: Category, dtype: object
    

    unique 价值观,谢谢@Sandeep Kadapa:

    print (test_df.loc[test_df['Value'] >= 3, 'Category'].unique())
    ['P']
    

    isin :

    print (test_df['Category'].isin(test_df.loc[test_df['Value'] >= 3, 'Category'].unique()))
    0     True
    1     True
    2     True
    3    False
    4    False
    5    False
    Name: Category, dtype: bool
    

    过滤系列的相同解决方案 MultiIndex 之后 groupby :

    s = test_df.groupby(['Category', 'Subcategory'])['Value'].sum()
    print (s)
    Category  Subcategory
    P         A              2.0
              B              5.0
              C              8.0
    Q         A              2.0
              B              1.0
              C              1.0
    Name: Value, dtype: float64
    
    idx0 = s.index.get_level_values(0)
    a = s[idx0.isin(idx0[s >= 3].unique())]
    print (a)
    Category  Subcategory
    P         A              2.0
              B              5.0
              C              8.0
    Name: Value, dtype: float64