lassence.net

Field notes from the AI frontier

Get top rows or random rows within groups in a DataFrame

--- archive: codebook, 2020–2023 · topic: Pandas ---
# Import libraries
import pandas as pd
import seaborn as sns

# Load sample data in a DataFrame
df = (
    sns.load_dataset('iris')
    .sample(n=20, random_state=20)
    .sort_values('species')
    .reset_index(drop=True)
    [['species', 'sepal_width']]
)
df
speciessepal_width
0setosa3.2
1setosa3.0
2setosa3.4
3setosa3.2
4setosa3.7
5setosa3.0
6versicolor2.7
7versicolor2.8
8versicolor2.9
9versicolor2.8
10versicolor2.9
11versicolor2.5
12versicolor2.4
13virginica3.2
14virginica2.5
15virginica2.8
16virginica3.0
17virginica2.2
18virginica3.0
19virginica2.8

Get top N rows of each group

An option is to sort values, then use groupby() followed by head()

# Get top 3 rows for each group, sorted by decreasing sepal width
(
    df
    .sort_values(['species', 'sepal_width'], ascending=[True, False])
    .groupby('species')
    .head(3)
)
speciessepal_width
4setosa3.7
2setosa3.4
0setosa3.2
8versicolor2.9
10versicolor2.9
7versicolor2.8
13virginica3.2
16virginica3.0
18virginica3.0

Get random rows within each group

To retrieve n random rows from each group, use sample(n) after a groupby():

# Get 1 random row within each group of the DataFrame
(
    df
    .groupby('species')
    .apply(lambda x: x.sample(1))
)
speciessepal_width
setosa1setosa3.0
versicolor10versicolor2.9
virginica13virginica3.2