大Pandas得到组内值的分布

2024-09-29 23:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 数据sampledf样本groupbys01s02f01
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:12

我没有使用value_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

相关问题 更多 >

    热门问题