我有一个像这样的数据框:
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以最有效的方式做到这一点?
答案 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
如果需要指定阈值,则将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_counts
和map
的替代解决方案:
df = df[df['col1'].map(df['col1'].value_counts()) > 1]
如果性能并不重要,请使用DataFrameGroupBy.filter
:
df = df.groupby('col1').filter(lambda x: len(x) > 1)