首页 > 解决方案 > 使用概率列的 pandas 中的随机抽样行

问题描述

我正在使用 python 和 pandas 从数据框中抽取随机样本。我的数据框如下所示:

第一列包含时间,第二列是平均速率,第三列是 1-sigma,第四列是与该行描述的事件相关的概率。

在此处输入图像描述

我知道我可以使用这段代码来绘制加权样本:

random=df.sample(n=100000, replace=True, weights='P>0', axis=0)

但我不确定在这里使用的概率是正确的“权重”。简而言之,我需要低 P>0 的值的采样频率低于 P>0 的值。

有人愿意就此分享意见/不同的选择吗?

谢谢!

标签: pythonpandasrandom

解决方案


使用“P>0”列作为权重确实会导致那些具有较高 P 值的值比那些具有较低值的值被更多地采样。但请注意,一行的 P 值与被采样的概率不对应,因为 P 的总和不等于 1。首先,pandas 将对列 P 进行归一化,使其加起来为 1,然后根据这些归一化概率进行采样。

这是我做的一个快速测试,它证明了这一点。首先,我生成一个数据帧,其中包含具有权重(未标准化)的列 P,然后我从数据帧中采样,列 P 给出 0 到 1 之间的权重,每个权重的行数相等。您可以在输出中看到,与较低权重相比,具有较高权重的行占采样结果的比例更大。

import pandas as pd
import numpy as np

ps = np.tile(np.arange(0,1,0.1),1000)
df = pd.DataFrame({"id":range(0,10000),"P":ps})

print(df.sample(1000,weights="P")["P"].value_counts(normalize=True))
>>>
0.9    0.207
0.8    0.188
0.7    0.152
0.6    0.119
0.5    0.109
0.4    0.084
0.3    0.065
0.2    0.052
0.1    0.024
Name: P, dtype: float64

推荐阅读