[英]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_counts
和map
替代解決方案:
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.