【发布时间】:2019-07-06 08:05:03
【问题描述】:
我有一个简单的数据框,例如:
cens codf codid
0 S01 F01 1
1 S01 F01 2
2 S01 F02 3
3 S01 F03 4
4 S02 F04 5
5 S02 F05 6
我正在尝试根据每个组内codf 计数的分布从每个cens 组中选择一个随机样本。基本上如果我分组:
In [387]: df.groupby('cens')['codf'].value_counts()
Out[387]:
cens codf
S01 F01 2
F02 1
F03 1
S02 F04 1
F05 1
Name: codf, dtype: int64
在 S01 cens 组中,codf 应具有(非标准化)概率分布,如向量:
[0,33 0,66 0,66]
这意味着 1 次有一个 codf 的值为 2,两次有两个 codf 的值为 1。我想得到一个样本,假设根据前面的每组 50% 的行分布。
我知道我可以:
df.groupby('cens').apply(lambda x: x.sample(frac=0.5))
但这里的问题是将前一个向量添加到sample 函数中的weight 关键字。我试图将它添加到原始数据框中,但到目前为止我只能添加一个具有相对出现的列。具有列分布(非标准化)的数据框应显示为:
cens codf codid pdf
0 S01 F01 1 0.33
1 S01 F01 2 0.33
2 S01 F02 3 0.66
3 S01 F03 4 0.66
4 S02 F04 5 1.00
5 S02 F05 6 1.00
然后我应该可以写了:
df.groupby('cens').apply(lambda x: x.sample(frac=0.5, weight=df['pdf']))
【问题讨论】:
-
可能的输出是什么?