Выберите строки в фрейме данных pandas, которые соответствуют первым двум различным элементам одного столбца

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я хотел бы отобразить все строки в фрейме данных, значения которых в столбце 'Nameid' соответствуют двум первым разным значениям, найденным в этом столбце.

В приведенном ниже примере два первых разных значения в названном столбце 'Nameid' — это 1 и 2 . Я хочу выбрать все строки, для которых 'Nameid' равно либо 1 или 2 , и отбросить остальные. Как мне это сделать?

Что у меня есть:

 import pandas as pd

df = pd.DataFrame(data={
    'Nameid': [1, 2, 3, 1],
    'Name': ['Michael', 'Max', 'Susan', 'Michael'],
    'Project': ['S455', 'G874', 'B7445', 'Z874'],
})
display(df.head(10))
  

введите описание изображения здесь

Чего я хочу:

введите описание изображения здесь

Ответ №1:

Первая сортировка по столбцу Nameid по DataFrame.sort_values :

 df = df.sort_values('Nameid')
  

затем используйте Series.isin с 2 первыми уникальными значениями по Series.unique :

 df1 = df[df['Nameid'].isin(df['Nameid'].unique()[:2])].reset_index(drop=True)
print (df1)
   Nameid     Name Project
0       1  Michael    S455
1       1  Michael    Z874
2       2      Max    G874
  

Альтернатива с Series.drop_duplicates :

 df1 = df[df['Nameid'].isin(df['Nameid'].drop_duplicates()[:2])].reset_index(drop=True)
  

РЕДАКТИРОВАТЬ: если хотите фильтровать по равному или меньшему 2 значению, спасибо @DarrylG:

 df2 = df[df['Nameid'] <= 2].reset_index(drop=True)
  

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

1. @jezrael — возможно, я неправильно понял вопрос, но не означает, что «.. все идентификаторы имен, которые больше двух, удаляются», означают, что идентификаторы <= 2. Этот код предоставляет первые два уникальных идентификатора, поэтому, похоже, он не работает, если идентификаторы Nameid находятся в другом порядке, например [1, 1, 3, 2]. Разве вам не нужен df[df[‘Nameid’].isin(df[‘Nameid’].drop_duplicates().sort_values()[:2])].sort_values(‘Nameid’)

2. @jezrael — в этом случае кажется, что решение будет просто: df[df['Nameid'] <= 2].reset_index(drop=True)