#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]