> ## Content Index
> Fetch the complete content index at: https://datascientyst.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# How to Get Top 10 Highest or Lowest Values in Pandas
- URL: https://datascientyst.com/get-top-10-highest-lowest-values-pandas/
- Published: 2021-09-01T06:38:46.000Z
- Updated: 2021-12-02T10:50:37.000Z
- Author: John D K
- Tags: Get

In this short guide, I'll show you how to **get top 5, 10 or N values in Pandas DataFrame.** You can find also how to **print top/bottom values for all columns** in a DataFrame.

If you need the most frequent values in a column or DataFrame you can check: [How to Get Most Frequent Values in Pandas Dataframe](https://datascientyst.com/p/a113714c-59ac-4be5-9375-cf6c5c0479ac/)

To start, here is the syntax that you may apply in order to **get top 10 biggest numeric values in your DataFrame**:

```python
df['Magnitude'].nlargest(n=10)

```

To list the **top 10 lowest values in DataFrame you can use:**

```python
df.nlargest(n=5, columns=['Magnitude', 'Depth'])

```

In the next section, I’ll show you more examples and other techniques in order **to get top/bottom values in DataFrame**.

## Step 1: Create Sample DataFrame

In this example we are going to use real data available from Kaggle:[Significant Earthquakes, 1965-2016](https://www.kaggle.com/usgs/earthquake-database?select=database.csv&ref=datascientyst.com).

To learn more about reading Kaggle data with Python and Pandas: [How to Search and Download Kaggle Dataset to Pandas DataFrame](https://datascientyst.com/search-download-kaggle-dataset-pandas-dataframe/)

```python
import pandas as pd

cols = ['Date', 'Time', 'Latitude', 'Longitude', 'Depth', 'Magnitude Type', 'Type', 'ID', 'Magnitude']
df = pd.read_csv(f'../data/earthquakes_1965_2016_database.csv.zip')[cols]

```

data:

| Date       | Latitude | Longitude | Depth | Magnitude Type | Magnitude |
| ---------- | -------- | --------- | ----- | -------------- | --------- |
| 01/02/1965 | 19.246   | 145.616   | 131.6 | MW             | 6.0       |
| 01/04/1965 | 1.863    | 127.352   | 80.0  | MW             | 5.8       |
| 01/05/1965 | \-20.579 | \-173.972 | 20.0  | MW             | 6.2       |
| 01/08/1965 | \-59.076 | \-23.557  | 15.0  | MW             | 5.8       |
| 01/09/1965 | 11.938   | 126.427   | 15.0  | MW             | 5.8       |

## Step 2: Get Top 10 biggest/lowest values for single column

You can use functions:

- `nsmallest` \- return the first n rows ordered by columns in ascending order
- `nlargest` \- return the first n rows ordered by columns in descending order

to get the top N highest or lowest values in Pandas DataFrame.

So let's say that we would like to find the strongest earthquakes by magnitude. From the data above we can use the following syntax:

```python
df['Magnitude'].nlargest(n=10)

```

the result is:

```
17083    9.1
20501    9.1
19928    8.8
16       8.7
17329    8.6
21219    8.6
...
Name: Magnitude, dtype: float64

```

How does it return the top 10 values? It orders all values in ascending or descending order. Then will return 5, 10 or N values from this order.

## Step 3: Get Top 10 biggest/lowest values - duplicates

As you can see in Step 2 there are duplicates in the results.

`nsmallest` / `nlargest` have a parameter:

- `keep{‘first’, ‘last’, ‘all’}, default ‘first’`

which helps to deal with duplicates.

Let's say that you would like to get 5 smallest values by `Depth` of the earthquake:

```python
df.nsmallest(n=5, columns=['Depth'])

```

result:

| Date       | Time     | Depth   | Magnitude Type | Type              | ID         | Magnitude |
| ---------- | -------- | ------- | -------------- | ----------------- | ---------- | --------- |
| 06/28/1992 | 12:00:45 | \-1.100 | ML             | Earthquake        | CI3043549  | 5.77      |
| 06/28/1992 | 11:57:34 | \-0.097 | MW             | Earthquake        | CI3031111  | 7.30      |
| 07/21/1986 | 22:07:16 | \-0.076 | ML             | Earthquake        | NC95459    | 5.60      |
| 02/16/1973 | 05:02:58 | 0.000   | MB             | Explosion         | USP00000JC | 5.60      |
| 07/23/1973 | 01:22:58 | 0.000   | MB             | Nuclear Explosion | USP00002TP | 6.30      |

It seems that we have many records with Depth 0\. In order to get all records which have Depth 0 we can use:

```python
df.nsmallest(n=5, columns=['Depth'], keep='all')

```

the result will return the previous ones plus the duplicated:

```
173 rows × 7 columns

```

While if we use `keep='last'` we will get again 5 rows as a result.

## Step 4: Get Top N values in multiple columns

You can get top 5, 10 or N records from multiple columns with:

- `nsmallest`
- `nlargest`

To do so you can use the following syntax:

```python
df.nlargest(n=5, columns=['Magnitude', 'Depth'])

```

result:

| Date       | Time     | Depth | Magnitude Type | Type       | Magnitude |
| ---------- | -------- | ----- | -------------- | ---------- | --------- |
| 12/26/2004 | 00:58:53 | 30.0  | MW             | Earthquake | 9.1       |
| 03/11/2011 | 05:46:24 | 29.0  | MWW            | Earthquake | 9.1       |
| 02/27/2010 | 06:34:12 | 22.9  | MWW            | Earthquake | 8.8       |
| 02/04/1965 | 05:01:22 | 30.3  | MW             | Earthquake | 8.7       |
| 03/28/2005 | 16:09:37 | 30.0  | MWW            | Earthquake | 8.6       |

## Step 5: How do `nsmallest` and `nlargest` work

So to summarise the algorithm:

- order all values - ascending or descending
- find top N values
- filter out duplicates ( depends on parameter `keep` )
- return N top values

Both methods will work only with numeric types. If you try to use them on columns with dtype object you will get an error:

> TypeError: Column 'Magnitude Type' has dtype object, cannot use method 'nlargest' with this dtype

## Step 6: Display Top values for all numeric columns in DataFrame

If you like to get top values for all columns you can use the next syntax:

```python
from pandas.api.types import is_numeric_dtype

dfs = []

for col in df.columns:
    top_values = []
    if is_numeric_dtype(df[col]):
        top_values = df[col].nlargest(n=7)
        dfs.append(pd.DataFrame({col: top_values}).reset_index(drop=True))
pd.concat(dfs, axis=1)

```

This will return the top values per column as a new DataFrame:

| Depth | Magnitude |
| ----- | --------- |
| 700.0 | 9.1       |
| 691.6 | 9.1       |
| 690.0 | 8.8       |
| 688.0 | 8.7       |
| 687.6 | 8.6       |

## Step 7: `nsmallest` and `nlargest` and datetime

It's possible to use methods **`nsmallest` and `nlargest` with datetime**. You need to be sure that the target column is from type: `datetime64[ns, UTC]`

If you need to convert string to datetime column you can use:

```python
df['Date'] = pd.to_datetime(df['Date'], utc=True)

```

and then use the `nlargest`:

```python
df['Date'].nlargest()

```

## Resources

- [Notebook](https://github.com/softhints/datascientyst/blob/master/0.guides/1.get-top-10-highest-lowest-values-pandas.ipynb?ref=datascientyst.com)
- [pandas.DataFrame.nlargest](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.nlargest.html?ref=datascientyst.com)
- [pandas.DataFrame.nsmallest](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.nsmallest.html?ref=datascientyst.com)