Нашли ошибку?
среднийpandas 3.0.6

Случайная выборка: sample

Взять случайные строки — заданное число или долю, с повторами или весами — и перемешать таблицу.

Нужно знать:DataFrame

Содержание статьи

Коротко

  • sample(n=3) — 3 случайные строки, sample(frac=0.1) — 10 % строк.
  • random_state=число — воспроизводимый результат; без него каждый вызов разный.
  • sample(frac=1) перемешивает все строки; ignore_index=True — заодно новый индекс.
  • replace=True — с повторами (бутстреп); weights — вероятность строки пропорциональна весу.
  • Без replace нельзя взять больше строк, чем есть в таблице.

Синтаксис

df.sample(n=None, frac=None, replace=False, weights=None,
        random_state=None, axis=0, ignore_index=False)

Параметры

ПараметрЧто делаетПо умолчанию
nсколько строк; нельзя вместе с frac1
fracдоля строк; с replace=True может быть больше 1None
replaceразрешить повторыFalse
weightsвеса строк: имя столбца или SeriesNone
random_stateseed или генератор np.random.GeneratorNone
ignore_indexновый индекс 0, 1, 2…False

Примеры

Данные для примеровиспользуются во всех примерах ниже
customers = pd.DataFrame({
    "name": ["Аня", "Борис", "Вика", "Глеб", "Дина", "Егор", "Женя", "Зоя"],
    "orders": [12, 3, 7, 1, 20, 5, 9, 2],
})
Несколько случайных строк
customers.sample(n=3, random_state=42)            # 3 случайные строки
Вывод
    name  orders
1  Борис       3
5   Егор       5
0    Аня      12
Доля строк
customers.sample(frac=0.5, random_state=1)        # половина строк
Вывод
    name  orders
7    Зоя       2
2   Вика       7
1  Борис       3
6   Женя       9
Перемешать таблицу
customers.sample(frac=1, random_state=7, ignore_index=True)   # перемешать все строки
Вывод
    name  orders
0   Вика       7
1   Егор       5
2    Аня      12
3   Женя       9
4   Глеб       1
5  Борис       3
6   Дина      20
7    Зоя       2
С повторами
customers.sample(n=10, replace=True, random_state=3)["name"].value_counts()   # с повторами
Вывод
name
Аня      4
Глеб     2
Егор     2
Вика     1
Борис    1
Name: count, dtype: int64
С весами
customers.sample(n=200, weights="orders", replace=True, random_state=5)["name"].value_counts().head(3)   # чаще всех — у кого больше заказов
Вывод
name
Дина    64
Аня     37
Женя    30
Name: count, dtype: int64
Один seed — одна выборка
a = customers.sample(n=2, random_state=10)["name"].tolist()
b = customers.sample(n=2, random_state=10)["name"].tolist()
a, b
Вывод
(['Вика', 'Глеб'], ['Вика', 'Глеб'])

Подводные камни

Больше строк, чем есть

n больше числа строкошибка: ValueError
customers.sample(n=20)                            # без replace больше строк, чем есть, не взять
Ошибка
ValueError: Cannot take a larger sample than population when 'replace=False'