对pandas数据帧的行进行采样,与列中的计数成比例

ele*_*ora 6 python pandas

我有一个大型的pandas数据帧,大约有10,000,000行.每个代表一个特征向量.特征向量以自然组形式出现,组标签位于一个名为的列中group_id.我想随机抽取10%行的说法,但与每个行的数量成比例group_id.

例如,如果group_id's是,A, B, A, C, A, B那么我想要我的一半采样行,有group_id A六分之六,六分group_id B之一group_id C.

我可以看到pandas函数示例,但我不知道如何使用它来实现这个目标.

Vai*_*ali 11

您可以使用groupby和sample

sample_df = df.groupby('group_id').apply(lambda x: x.sample(frac=0.1))
Run Code Online (Sandbox Code Playgroud)

  • 我只想指出一下,使用此代码可能会导致组未出现在结果中。具体地说,如果组的分数乘以小于1(即使是,9),则会发生这种情况。因此,只有10%的比例,您将只能获得包含至少10个元素的组的样本。不过,这可能不是问题 (2认同)

irk*_*sor 6

下面的示例总共 N 行,其中每个组以其与最接近整数的原始比例出现,然后使用以下方法重新排列和重置索引:

df = pd.DataFrame(dict(
    A=[1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4],
    B=range(20)
))
Run Code Online (Sandbox Code Playgroud)

简短而甜蜜:

df.sample(n=N, weights='A', random_state=1).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

长版

df.groupby('A', group_keys=False).apply(lambda x: x.sample(int(np.rint(N*len(x)/len(df))))).sample(frac=1).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)