Как получить строки на основе уникальных значений столбцов их первого появления - PullRequest
2 голосов
/ 22 марта 2019

У меня есть такой фрейм данных:

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

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

Ответы [ 2 ]

1 голос
/ 22 марта 2019

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

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 голос
/ 22 марта 2019

Создайте вспомогательные серии последовательных групп с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...