带权重的 Pandas 样本

Bea*_*ear 7 sample pandas

我已经df并且我想从中对某些变量的分布进行一些抽样。假设df['type'].value_counts(normalize=True)返回:

0.3 A
0.5 B
0.2 C
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情sampledf = df.sample(weights=df['type'].value_counts())sampledf ['type'].value_counts(normalize=True)将返回几乎相同的分布。如何在这里通过频率传递 dict?

Jos*_*der 6

Weights必须采用与原始 df长度相同系列,因此最好将其添加为一列:

df['freq'] = df.groupby('type')['type'].transform('count')
sampledf = df.sample(weights = df.freq)
Run Code Online (Sandbox Code Playgroud)

或者不添加列:

sampledf = df.sample(weights = df.groupby('type')['type'].transform('count'))
Run Code Online (Sandbox Code Playgroud)


小智 5

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

df['freq'] = 1./df.groupby('type')['type'].transform('count')
sampledf = df.sample(weights = df.freq)
Run Code Online (Sandbox Code Playgroud)

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

w_j=n_samples / (n_classes * n_samples_j)
Run Code Online (Sandbox Code Playgroud)