我有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)
将返回几乎相同的分布。如何在这里通过频率指令?
答案 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)