Python 熊猫在组内获得值的分布

Python 熊猫在组内获得值的分布,python,pandas,Python,Pandas,我有一个简单的数据框架,如: 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组中随机抽取一个样本。基本上,如果我是groupby: In [387]: df.groupby('cens')['codf'].value_count

我有一个简单的数据框架,如:

  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
组中随机抽取一个样本。基本上,如果我是groupby:

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次a的
codf
值为2,2次a的
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']))

我没有使用
value\u count
,因为您想将值赋回原始df,所以我使用的是
transform

s=df.groupby(['cens','codf']).codf.transform('count')
s1=df['codf'].groupby([df['cens'],s]).transform('nunique')
s1
Out[256]: 
0    1
1    1
2    2
3    2
4    2
5    2
Name: codf, dtype: int64
df['pdf']=s1/df.groupby(['cens']).codf.transform('nunique')
df
Out[258]: 
  cens codf  codid       pdf
0  S01  F01      1  0.333333
1  S01  F01      2  0.333333
2  S01  F02      3  0.666667
3  S01  F03      4  0.666667
4  S02  F04      5  1.000000
5  S02  F05      6  1.000000

可能的输出是什么?