使用概率列在熊猫中随机采样行

时间:2020-04-24 11:14:39

标签: python pandas random

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

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

enter image description here

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

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

但是我不确定概率是否是此处使用的正确“权重”。 简而言之,我需要低P> 0的值比P> 0的值更不被采样。

有人愿意对此发表意见/不同的选择吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用“ P> 0”列作为权重确实会导致对P值较高的那些值进行采样,而对P值较低的那些进行采样。但是请注意,因为P的总和不等于1,所以行的P的值并不对应于被采样的概率。首先,大熊猫将对列P进行归一化,以便它加起来等于一,然后根据归一化的概率进行采样。

这是我进行的一项快速测试,证明了这一点。首先,我生成一个包含具有权重(未归一化)的列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