Почему df.sample и df.apply работают по-разному в этом случае? - PullRequest
0 голосов
/ 12 июня 2018

Предположим, у меня есть фрейм данных, который я хочу сэмплировать

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(100,2)),columns=list('AB'))

Если у нас есть

s = df.sample(5)
print(s)

Мы получаем кадр длины 5, который подсказывает мне, что это индексы, которые имеютбыл выбран случайным образом, а затем возвращена каждая строка.

Однако, если я запустил

 t = df.apply(lambda x: x.sample(5))
 print(t)

, я получаю кадр длины 10, каждый столбец отбирается 5 раз, а кадр данных возвращается NaN в ячейках, у которых нет связанной выборки.Почему поведение этих двух функций отличается?Я ожидаю, что они будут одинаковыми?

Похоже, что df.sample(5) эквивалентно

 df.apply(lambda x: np.random.choice(x,5))

Так что теперь, если я сгруппирую фрейм данных.

g = df.groupby('A')

затем g.apply(lambda x: x.sample(2)) дает мне то, что я хочу (случайная выборка 2 из каждой группы), но применяя ту же эквивалентность, что и раньше

 g.apply(lambda x: np.random.choice(x,2))

дает мне ValueError,Почему это?

1 Ответ

0 голосов
/ 12 июня 2018

.sample по умолчанию будет использовать случайное начальное число во время его вызова (или случайное, если оно не указано).

Когда вы делаете df.sample(5), вы берете 5 случайных строк на основеодно семя.Однако, когда вы делаете t = df.apply(lambda x: x.sample(5)), новое семя генерируется для каждого вызова .sample (например, разные для каждого столбца), и результатом будет N строк, представляющих количество уникальных индексов, которые были выбраны (вероятно, будет10 в вашем примере, но может быть меньше).

Вы можете заставить все вызовы использовать одинаковые случайные последовательности, указав аргумент random_state для выборки, например:

df.apply(lambda x: x.sample(5, random_state=42))

, который даетВы:

    A  B
83  8  3
53  7  3
70  7  2
45  3  8
44  1  1

То же самое, что df.sample(5, random_state=42) дает вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...