熊猫配重样品

时间:2019-03-07 11:06:25

标签: pandas sample

我有df,我想从中抽样一些变量。假设df['type'].value_counts(normalize=True)返回:

0.3 A
0.5 B
0.2 C

我想制作类似sampledf = df.sample(weights=df['type'].value_counts())的东西,使sampledf ['type'].value_counts(normalize=True)将返回几乎相同的分布。如何在这里通过频率指令?

2 个答案:

答案 0 :(得分:1)

Weights必须以series of the same length作为原始df,因此最好将其添加为列:

df['freq'] = df.groupby('type')['type'].transform('count')
sampledf = df.sample(weights = df.freq)

或者不添加列:

sampledf = df.sample(weights = df.groupby('type')['type'].transform('count'))

答案 1 :(得分:1)

除了上面的答案,应该注意的是,如果您想对每种类型进行平均采样,您应该将代码调整为:

df['freq'] = 1./df.groupby('type')['type'].transform('count')
sampledf = df.sample(weights = df.freq)

在两个类的情况下。如果你有两个以上的类,你可以使用下面的代码来概括权重计算:

w_j=n_samples / (n_classes * n_samples_j)