Как получить строки на основе уникальных значений столбцов их первого появления

#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    col3
 1        A       B
 1        D       R
 2        R       P
 2        D       F
 3        T       G
  

Как сделать это наиболее эффективным способом в pandas?

Комментарии:

1. @jezrael Я хочу сохранить первые три уникальных значения col1, drop_duplicates () не создает ant-решение, и если его дубликат, пожалуйста, дайте мне ссылку

2. Этот вопрос отличается от вопроса о дубликатах, на который ссылаются.

Ответ №1:

Создайте вспомогательные последовательные группы с помощью Series.ne , Series.shift и Series.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
  

Ответ №2:

вот решение, которое останавливает сразу найденные три первых разных значения

 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
  

Комментарии:

1. @jezrael я не говорю о времени выполнения, но быстро с точки зрения найденного решения.. извините за мой английский

2. Потому что последнее предложение OP How to do it most efficient way in pandas ? 🙂

Ответ №3:

Вы можете использовать duplicated метод в pandas:

 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]