Случайное Семя Выбирало Разные Ряды - PullRequest
0 голосов
/ 26 марта 2019

Я применял .sample с random_state, установленным на константу, и после использования set_index он начал выбирать разные строки. Член удален, который ранее был включен в подмножество. Я не уверен, как посев выбирает строки. Имеет ли это смысл или что-то пошло не так?

Вот что было сделано:

df.set_index('id',inplace=True, verify_integrity=True)

df_small_F = df.loc[df['gender']=='F'].apply(lambda x: x.sample(n=30000, random_state=47))

df_small_M = df.loc[df['gender']=='M'].apply(lambda x: x.sample(n=30000, random_state=46))

df_small=pd.concat([df_small_F,df_small_M],verify_integrity=True)

Когда я сортирую df_small по индексу и печатаю, он дает разные результаты.

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

При выборке строк (без веса) важны только n, количество строк и выбор замены.Это генерирует индексы .iloc для принятия независимо от данных.

Для строк выборка происходит как;

axis_length = self.shape[0]  # DataFrame length

rs = pd.core.common.random_state(random_state)  
locs = rs.choice(axis_length, size=n, replace=replace, p=weights)  # np.random_choice
return self.take(locs, axis=axis, is_copy=False)

Просто для иллюстрации точки

Пример данных

import pandas as pd
import numpy as np

n = 100000
np.random.seed(123)
df = pd.DataFrame({'id': list(range(n)), 'gender': np.random.choice(['M', 'F'], n)})
df1 = pd.DataFrame({'id': list(range(n)), 'gender': ['M']}, 
                    index=np.random.choice(['foo', 'bar', np.NaN], n)).assign(blah=1)

Выборка всегда будет выбирать строку 42083 (индекс целочисленного массива): df.iloc[42803] для этого семени и длины:

df.sample(n=1, random_state=123)
#          id gender
#42083  42083      M

df1.sample(n=1, random_state=123)
#        id gender  blah
#foo  42083      M     1

df1.reset_index().shift(10).sample(n=1, random_state=123)
#      index       id gender  blah
#42083   nan  42073.0      M   1.0

Четный ноль:

np.random.seed(123)
np.random.choice(df.shape[0], size=1, replace=False)
#array([42083])
0 голосов
/ 26 марта 2019

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

...