【问题标题】:How to filter repeat rows based on certain criteria如何根据特定条件过滤重复行
【发布时间】:2019-05-20 06:39:13
【问题描述】:

我有一个看起来像这样的数据框,但行数更多:

id         status       year
1           yes          2013
1           no           2013
1           yes          2014
3           no           2012
4           yes          2014
6           no           2014

我想过滤数据框,以便如果两行之间的 id 和 year 列相同,但 status 列不同,则只保留状态为“yes”的行。如果 id 和 year 组合的“no”没有与之关联的“yes”,我仍然想保留它。这导致我无法仅过滤状态列以仅具有“是”的行的问题。

这导致我无法仅过滤状态列以仅包含带有“是”的行的问题。

生成的数据框应如下所示,其中第一个数据框的第二行将被取出,因为 ID 1 和 2013 年有一个与之关联的“是”。但是 ID 为 3 和 6 的行仍然存在,因为这些 ID 和年份组合没有关联:

id         status       year
1           yes          2013
1           yes          2014
3           no           2012
4           yes          2014
6           no           2014

【问题讨论】:

    标签: python pandas filtering


    【解决方案1】:

    你可以计算两个条件:

    1. 一个使用groupbytransformnunique,以及
    2. 与状态有关的另一个

    OR 两个掩码,过滤df:

    m1 = df.groupby(['id','year']).status.transform('nunique').eq(1) 
    m2 = df.status.eq('yes')
    df[m1 | m2]
    
       id status  year
    0   1    yes  2013
    2   1    yes  2014
    3   3     no  2012
    4   4    yes  2014
    5   6     no  2014
    

    【讨论】:

    • 添加,即使使用此解决方案,对status 进行分类也是一个好主意,并且会提高性能。
    • @jpp(不相关,但是...)我对 pandas 如何使用分类数据处理各种函数的行为感到非常满意。请参阅case 1,对类别进行交叉表自动重新索引,以及case 2 groupby 以类似的方式完成。
    【解决方案2】:

    sort_values + drop_duplicates

    这是使用Categorical Data 的好机会。您可以按status 排序,然后按idyear 删除重复项:

    df['status'] = pd.Categorical(df['status'], ordered=True, categories=['yes', 'no'])
    
    res = df.sort_values('status').drop_duplicates(['id', 'year']).sort_index()
    
    print(res)
    
       id status  year
    0   1    yes  2013
    2   1    yes  2014
    3   3     no  2012
    4   4    yes  2014
    5   6     no  2014
    

    根据您的用例,可能不需要按索引进行最终排序。

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多