python - 过滤至少有 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()
先感谢您!
解决方案
采用:
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
推荐阅读
- regex - 正则表达式免除前缀匹配
- java - 使用 Poi 和 java 在电子表格中编写
- python - 如何从 Python 中的请求响应中获取值
- javascript - 如何在尝试断言之前进行测试以等待异步 React 组件呈现?
- python - 如何用热键打破while循环
- html - SVG 在父容器外被切断
- javascript - 如何在 for 循环中按顺序正确执行级联 MySQL 查询?
- python-3.x - 使用熊猫创建额外的列,在每个空白行之后增加值
- laravel - Laravel - 应该发送通知方法
- reactjs - 无效的挂钩调用。Hooks 只能在函数体内部调用错误