首页 > 解决方案 > 过滤至少有 1 行满足条件的 GroupBy 对象

问题描述

假设有这个 test_df:

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 的类别。在当前的 test_df 中,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()

先感谢您!

标签: pythonpandaspandas-groupby

解决方案


采用:

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使用after过滤系列的相同解决方案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

推荐阅读