python - 使用概率列的 pandas 中的随机抽样行
问题描述
我正在使用 python 和 pandas 从数据框中抽取随机样本。我的数据框如下所示:
第一列包含时间,第二列是平均速率,第三列是 1-sigma,第四列是与该行描述的事件相关的概率。
我知道我可以使用这段代码来绘制加权样本:
random=df.sample(n=100000, replace=True, weights='P>0', axis=0)
但我不确定在这里使用的概率是正确的“权重”。简而言之,我需要低 P>0 的值的采样频率低于 P>0 的值。
有人愿意就此分享意见/不同的选择吗?
谢谢!
解决方案
使用“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
推荐阅读
- android - Android - 每隔几秒可靠地 ping 服务器
- python - 具有已建立范围的第一个值的新列
- excel - 调用 MS 项目任务的唯一 ID 时出现 Excel VBA 错误
- php - 如何匹配字符串中的所有字符并收集多个组?
- exchange-server - 电子邮件收件箱文件夹中 UID 的最大值是多少?
- python - 如何创建一个脚本来逐行读取文件并将它们连接成一个字符串?(Python 或 Bash)
- regex - React Native 中的美元格式正则表达式
- hive - 如何快速获取 150 多个表的最近十天分区计数
- python - 拆分已经在列表中的字符串
- javascript - 为什么我收不到邮件?