Como encontrar os N valores mínimos para o DataFrame, Python-3

9

Eu tenho abaixo do Dataframe com o campo 'Idade', precisa encontrar a idade mínima 3 entre os 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()  

Quer as duas principais idades, ou seja, 18, 23 na lista, como conseguir isso?

Nota: DataFrame - DF contém duplicatas por idade, ou seja, 18 e 23 repetidas duas vezes, precisam de valores exclusivos.

Espião
fonte

Respostas:

14

Você pode fazer uso de nsmallest(..)[pandas-doc] :

df.nsmallest(2, 'Age')

Para os dados de amostra fornecidos, isso nos fornece:

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

Ou se você precisar apenas do valor da Agecoluna:

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

ou você pode agrupá-lo em uma lista:

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

Você pode obter os n menores valores exclusivos , primeiro construindo a Seriescom valores exclusivos:

>>> 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
Willem Van Onsem
fonte
2
@SPy: você também pode fazer uso df['Age'].nsmallest(2):) #
Willem Van Onsem 25/12/19
3

A coisa certa é usar nsmallest, aqui eu mostro uma outra maneira: DataFrame.sort_values+DataFrame.head

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

ATUALIZADA

Se houver duplicatas , poderíamos usar Series.drop_duplicatesanteriormente:

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

ou np.sort+np.unique

[*np.sort(df['Age'].unique())[:2]]
#[18, 23]
ansev
fonte