使用Pandas / Python在数据框中出现的列值小于特定数目时删除行吗?

时间:2019-02-26 11:08:19

标签: python pandas dataframe

我有一个像这样的数据框:

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以最有效的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用duplicated设置keep=False,它将为True中的所有重复值返回col1,然后只需在数据帧上使用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

答案 1 :(得分:1)

DataFrame.duplicated与指定列col1一起用于搜索重复项,对所有重复项行使用keep=False来返回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

如果需要指定阈值,则将transformsize一起使用,并按照与第一种解决方案相同的方式进行过滤:

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)