【问题标题】:pandas get distributions of values within group熊猫获得组内值的分布
【发布时间】: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']))

【问题讨论】:

  • 可能的输出是什么?

标签: python pandas


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2019-12-12
    相关资源
    最近更新 更多