Как найти верхние N минимальных значений из DataFrame, Python-3

9

У меня ниже Dataframe с полем «Возраст», необходимо найти до 3-х минимальный возраст из DataFrame

DF = pd.DataFrame.from_dict({'Name':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 'Age':[18, 45, 35, 70, 23, 24, 50, 65, 18, 23]})

DF['Age'].min()  

Хотите топ два возраста, то есть 18, 23 в списке, как этого добиться?

Примечание: DataFrame - DF содержит дубликаты возраста, т.е. 18 и 23, повторенные дважды, требующие уникальных значений.

шпион
источник

Ответы:

14

Вы можете использовать nsmallest(..)[pandas-doc] :

df.nsmallest(2, 'Age')

Для данных данного примера это дает нам:

>>> df.nsmallest(2, 'Age')
  Name  Age
0    A   18
4    E   23

Или если вам нужно только значение Ageстолбца:

>>> df['Age'].nsmallest(2)
0    18
4    23
Name: Age, dtype: int64

или вы можете поместить его в список:

>>> df['Age'].nsmallest(2).to_list()
[18, 23]

Вы можете получить n наименьших уникальных значений, сначала создав a Seriesс уникальными значениями:

>>> pd.Series(df['Age'].unique()).nsmallest(2)
0    18
4    23
dtype: int64
>>> df['Age'].drop_duplicates().nsmallest(2)
0    18
4    23
Name: Age, dtype: int64
Виллем Ван Онсем
источник
2
@ SPY: вы также можете использовать df['Age'].nsmallest(2):)
Виллем Ван Онсем
3

Правильно использовать nsmallest , здесь я покажу другой способ: DataFrame.sort_values+DataFrame.head

df['Age'].sort_values().head(2).tolist()
#[18, 23]

ОБНОВЛЕНО

Если есть дубликаты , мы могли бы использовать Series.drop_duplicatesранее:

df['Age'].drop_duplicates().nsmallest(2).tolist()
#df['Age'].drop_duplicates().sort_values().head(2).tolist()
#[18, 23]

или np.sort+np.unique

[*np.sort(df['Age'].unique())[:2]]
#[18, 23]
ansev
источник