【问题标题】:Drop all group rows when met a condition?满足条件时删除所有组行?
【发布时间】:2019-03-31 15:00:36
【问题描述】:

我的 pandas 数据框有基于“col10”和“col1”的两级组。我想要做的是,如果另一列中的指定值重复 或该值在组中不存在(只保留指定值存在一次的组)例如:

  • 原始数据框:

    df = pd.DataFrame( {'col0':['A','A','A','A','A','B','B','B','B','B','B','B','c'],'col1':[1,1,2,2,2,1,1,1,1,2,2,2,1], 'col2':[1,2,1,2,3,1,2,1,2,2,2,2,1]})

我需要在原始 DF 中保留组的行,例如 (['A',1],['A',2],['B',2])

  • 所需的数据框:

  • 我尝试了这一步:

    df.groupby(['col0','col1']).apply(lambda x: (x['col2']==1).sum()==1)

结果在哪里

col0  col1
A     1        True
      2        True
B     1       False
      2        True
c     1       False
dtype: bool

如何根据这个 bool 创建想要的 Df?

【问题讨论】:

    标签: pandas pandas-groupby drop-duplicates


    【解决方案1】:

    你可以这样做:

    m=(df.groupby(['col0','col1'])['col2'].
         transform(lambda x: np.where((x.eq(1)).sum()==1,x,np.nan)).dropna().index)
    df.loc[m]
    

    或者:

    df[df.groupby(['col0','col1'])['col2'].transform(lambda x: x.eq(1).sum()==1)]
    

       col0  col1  col2
    0     A     1     1
    1     A     1     2
    2     A     2     1
    3     A     2     2
    4     A     2     3
    12    c     1     1
    

    【讨论】:

    • 感谢您的回答。我把这个列表 [('A',1),('A',2),('B',2)] 用于说明我不需要指定组。
    • @Sidhom 您要过滤的条件是什么?
    • 保留col2中value(1)存在且不重复的组。
    • @Sidhom 添加了更好的解决方案。 :)
    猜你喜欢
    • 2016-12-04
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2021-12-15
    • 2021-12-26
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多