我有一个包含 ~200,000 行的 Pandas 数据框,我想创建 5 个随机样本,每个样本 1000 行,但是我不希望这些样本中的任何一个包含同一行两次。
要创建我一直使用的随机样本:
import numpy as np
rows = np.random.choice(df.index.values, 1000)
sampled_df = df.ix[rows]
Run Code Online (Sandbox Code Playgroud)
然而,仅仅这样做几次就会冒着重复的风险。处理这个问题的最好方法是跟踪每次采样哪些行?
您可以使用df.sample.
一个 100 行 5 列的数据框:
df = pd.DataFrame(np.random.randn(100, 5), columns = list("abcde"))
Run Code Online (Sandbox Code Playgroud)
样本 5 行:
df.sample(5)
Out[8]:
a b c d e
84 0.012201 -0.053014 -0.952495 0.680935 0.006724
45 -1.347292 1.358781 -0.838931 -0.280550 -0.037584
10 -0.487169 0.999899 0.524546 -1.289632 -0.370625
64 1.542704 -0.971672 -1.150900 0.554445 -1.328722
99 0.012143 -2.450915 -0.718519 -1.192069 -1.268863
Run Code Online (Sandbox Code Playgroud)
这确保了这 5 行是不同的。如果你想重复这个过程,我建议采样 number_of_rows * number_of_samples 行。例如,如果每个样本将包含 5 行,而您需要 10 个样本,则采样 50 行。前 5 个将是第一个样本,后五个将是第二个......
all_samples = df.sample(50)
samples = [all_samples.iloc[5*i:5*i+5] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)