Python 如何基于第一次出现的唯一列值获取行

Python 如何基于第一次出现的唯一列值获取行,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据框: df col1 col2 col3 1 A B 1 D R 2 R P 2 D F 3 T G 1 R S 3 R S 我想得到具有前3个唯一值col1的数据帧。如果某个col1值稍后出现在df中,它将忽略 最终的数据帧应如下所示: df col1 col2

我有这样一个数据框:

df
col1    col2    col3
 1        A       B
 1        D       R
 2        R       P
 2        D       F
 3        T       G
 1        R       S
 3        R       S
我想得到具有前3个唯一值col1的数据帧。如果某个col1值稍后出现在df中,它将忽略

最终的数据帧应如下所示:

df
col1    col2    col3
 1        A       B
 1        D       R
 2        R       P
 2        D       F
 3        T       G

如何在pandas中以最有效的方式执行此操作?

使用序列创建助手连续组,然后按以下方式进行筛选:


这里有一个解决方案,它会立即停止,找到前三个不同的值

import pandas as pd
data="""
col1    col2    col3
 1        A       B
 1        D       R
 2        R       P
 2        D       F
 3        T       G
 1        R       S
 3        R       S
 """
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
nbr = 3
dico={}
for index, row in df.iterrows():
    dico[row.col1]=True
    if len(dico.keys())==nbr:
        df = df[0:index+1]
        break

print(df)

  col1 col2 col3
0     1    A    B
1     1    D    R
2     2    R    P
3     2    D    F
4     3    T    G
您可以在以下位置使用该方法:

mask1 = df.duplicated(keep = "first") # this line is to get the first occ.
mask2 = df.duplicated(keep = False)   # this line is to get the row that occ one single time.
mask =  ~mask1 | ~mask2
df[mask]

@jezrael我想保留前三个唯一的col1值,drop_duplicates()不构成ant解决方案,如果它是重复的,请给我链接。这个问题与drop duplicates链接的问题不同。@jezrael我不说执行时间,但找到解决方案的速度很快。。对不起,我说的是英语,因为最后一句话是《熊猫》中最有效的方法是什么?:)
import pandas as pd
data="""
col1    col2    col3
 1        A       B
 1        D       R
 2        R       P
 2        D       F
 3        T       G
 1        R       S
 3        R       S
 """
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
nbr = 3
dico={}
for index, row in df.iterrows():
    dico[row.col1]=True
    if len(dico.keys())==nbr:
        df = df[0:index+1]
        break

print(df)

  col1 col2 col3
0     1    A    B
1     1    D    R
2     2    R    P
3     2    D    F
4     3    T    G
mask1 = df.duplicated(keep = "first") # this line is to get the first occ.
mask2 = df.duplicated(keep = False)   # this line is to get the row that occ one single time.
mask =  ~mask1 | ~mask2
df[mask]