随机种子选择不同的行

时间:2019-03-26 15:03:40

标签: python python-3.x pandas random-seed

我正在将random_state设置为常量的.sample应用,并且在使用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 :(得分:0)

在读取数据之后且执行.sample()之前应用.sort_index()可以更正此问题。只要数据保持不变,每次都会产生相同的样本。

答案 1 :(得分:0)

在对行进行采样(不计权重)时,唯一重要的是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])