繁体   English   中英

使用pandas / python在数据框中出现列值小于某个数字时删除行?

[英]Remove rows when the occurrence of a column value in the data frame is less than a certain number using pandas/python?

我有一个这样的数据框:

df
col1    col2
A         1
B         1
C         2
D         3
D         2
B         1
D         5

我已经看到,在数据框中,带有B和D的col1值出现的次数超过一次。

我希望将这些值保留为多于一个,最终的数据框将如下所示:

col1     col2
 B         1
 D         3
 D         2
 B         1
 D         5

如何使用pandas / python以最有效的方式执行此操作?

您可以使用duplicated设置keep=False ,它将为col1所有重复值返回True ,然后在数据帧上使用boolean indexation:

df[df.col1.duplicated(keep=False)]

   col1  col2
1    B     1
3    D     3
4    D     2
5    B     1
6    D     5

更新

要保持col1发生的次数超过thr次数,请使用:

thr = 2
df[df.col1.duplicated(keep=False).groupby(df.col1).transform('sum').gt(thr)]

   col1  col2
3    D     3
4    D     2
6    D     5

使用DataFrame.duplicated ,为搜索对象指定列col1 ,使用keep=False ,返回所有dupe行的True ,最后按boolean indexing过滤:

df = df[df.duplicated('col1', keep=False)]
print (df)
  col1  col2
1    B     1
3    D     3
4    D     2
5    B     1
6    D     5

如果需要指定阈值使用transform size和过滤器相同的方式像第一个解决方案:

df = df[df.groupby('col1')['col1'].transform('size') > 1]
print (df)
  col1  col2
1    B     1
3    D     3
4    D     2
5    B     1
6    D     5

使用value_countsmap替代解决方案:

df = df[df['col1'].map(df['col1'].value_counts()) > 1]

如果性能不重要,请使用DataFrameGroupBy.filter

df = df.groupby('col1').filter(lambda x: len(x) > 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM