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

时间:2019-03-22 06:37:14

标签: 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

我想获取col1的前3个唯一值的数据帧。如果某些col1值稍后出现在df中,它将被忽略。

最终数据框应如下所示:

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

如何在熊猫中最有效的方式?

3 个答案:

答案 0 :(得分:1)

使用Series.neSeries.shiftSeries.cumsum创建助手连续组系列,然后按boolean indexing进行过滤:

N = 3
df = df[df.col1.ne(df.col1.shift()).cumsum() <= N]
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

详细信息

print (df.col1.ne(df.col1.shift()).cumsum())
0    1
1    1
2    2
3    2
4    3
5    4
6    5
Name: col1, dtype: int32

答案 1 :(得分:1)

这是一种解决方案,可立即停止发现三个第一个不同的值

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

答案 2 :(得分:0)

您可以在 Pandas 中使用 duplicated 方法:

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]