首页 > 解决方案 > 过滤掉一些不包含python中列的特定情况的组

问题描述

我是 python 新手,我有一个关于如何过滤掉一些不包含任何女性案例的组(按 'date' 分组)的问题。假设我有一个如下数据框:

import pandas as pd
import numpy as np

exam_data  = {
        'date': ['2000-1', '2000-1', '2000-1', '2000-2', '2000-2', '2000-3', '2000-4', '2000-4', '2000-5', '2000-5','2000-5'],
        'sex': ['M', 'M', 'F', 'M', 'M', 'F', 'M', 'M', 'F', 'F', 'M'],
        'qualify': ['yes', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'no', 'yes', 'no']}
df_exam = pd.DataFrame(exam_data)

我已经尝试过,这似乎是正确的,但我觉得它太具体了,因为我使用了包含“F”的字符串:

df_filter = df_exam.groupby("date").filter(lambda gr: gr["sex"].str.contains("F").any())

是否有任何其他算法比这更有效,或者可能比这更多的练习?

非常感谢您的评论。

标签: pythonpandaspandas-groupbyfiltering

解决方案


为了获得更好的性能,永远不要使用,更好的是通过使用掩码和过滤器filter创建布尔掩码:GroupBy.transformboolean indexing

df_filter = df_exam[df_exam["sex"].eq("F").groupby(df_exam["date"]).transform('any')]

或者也可以替代,如果更好,取决于数据transform- 按条件获取所有s 并使用date过滤:boolean indexingSeries.isin

dates = df_exam.loc[df_exam["sex"].eq("F"), 'date'].unique()

df_filter = df_exam[df_exam["date"].isin(dates)]

推荐阅读