我正在将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进行排序并打印时,它会产生不同的结果。
答案 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])