【问题标题】:pandas filter rows based on atmost matching criteriapandas 根据最多匹配条件过滤行
【发布时间】:2022-01-12 13:21:15
【问题描述】:

我有一个如下所示的数据框

df=pd.DataFrame({'subjects':['A','A','D','B','B','C'],
                'B':['12','12','13','14','14','16'],
                'C':[21,23,24,25,26,27]
                })
df['r_no'] = df.groupby(['subjects','B']).cumcount()+1

现在,我只想选择只有r_no = 1(而不是 r_no > 1)的行。

我尝试了以下

df[df['subjects'].value_counts() == 1]
df.iloc[df['subjects'].value_counts() == 1:,]
df.ix[df['subjects'].value_counts() == 1:,]
df[(df['r_no'] == 1) & (df['r_no'] < 2)]

它们都不起作用。

我希望我的输出如下所示。

您可以看到subjects = Asubjects = B 被排除在外,因为它们也有r_no > 1 的行。基本上,我想在数据框中选择只有一条记录的主题(r_no)

【问题讨论】:

  • @wwnde 不行,这样会导致输出不正确

标签: python pandas dataframe numpy filter


【解决方案1】:

IIUC,你想做的只是为了保持大小为 1 的组:

df[df.groupby(['subjects','B'])['C'].transform(len).le(1)]

或者甚至只保留具有唯一行的主题:

df[~df['subjects'].duplicated(keep=False)]

输出:

  subjects   B   C
2        D  13  24
5        C  16  27

【讨论】:

  • 谢谢,为帮助点赞
  • 但它做你想做的事吗? ;)
  • 是的,我得到了预期的输出
  • 这并不意味着它做你想要的,例如,如果主题 A 也有不同的 B 值,这两种方法不会产生相同的结果
【解决方案2】:
df[df.groupby('subjects')['r_no'].transform(lambda x: ~(x.ne(1).any()))]



   subjects   B   C  r_no
2        D  13  24     1
5        C  16  27     1

【讨论】:

  • 谢谢,为帮助点赞
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多