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