Groupby大熊猫计算百分比

时间:2016-04-13 20:41:01

标签: pandas

我跑完后有一个groupby对象:

grouped_mask=L2014_2.groupby(['state'])
grouped_mask.mask.value_counts()

state  mask 
AL     False    105931
       True         77
AR     False     67788
       True       1774
AZ     False     90068
       True        151
CA     False    586184
       True          4
CO     False     75188
       True      14360
CT     False     78270
       True          1

现在我需要计算每个州的真实百分比。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

您也可以设置normalize参数以获取相对频率:

grouped_mask.mask.value_counts(normalize=True)

只需乘以100得到百分比: - )

问候

答案 1 :(得分:1)

你可以在第一级groupby然后应用一个lambda,它将真/假计数除以总和:

In [20]:
df.groupby(level=0).apply(lambda x: x/x.sum() * 100)

Out[20]:
                 Count
state mask            
AL    False  99.927364
      True    0.072636
AR    False  97.449757
      True    2.550243
AZ    False  99.832629
      True    0.167371
CA    False  99.999318
      True    0.000682
CO    False  83.963908
      True   16.036092
CT    False  99.998722
      True    0.001278

要过滤上述内容以获取False标签,您可以使用slice s进行高级索引:

In [33]:
gp = df.groupby(level=0).apply(lambda x: x/x.sum() * 100)
gp.loc(axis=0)[slice(None),False]

Out[33]:
                 Count
state mask            
AL    False  99.927364
AR    False  97.449757
AZ    False  99.832629
CA    False  99.999318
CO    False  83.963908
CT    False  99.998722

答案 2 :(得分:0)

gp=grouped_mask.mask.value_counts().groupby(level=0).apply(lambda x: 100*x/float(x.sum()))   

state  mask 
AL     False    94.37
       True      5.63
AR     False    73.85
       True     26.15
AZ     False    91.88
       True      8.12
CA     False    99.57
       True      0.43
CO     False    64.66
       True     35.34
gp.sort_index(level=0)
gp.loc(axis=0)[slice(None),False]

KeyError:'MultiIndex Slicing要求索引完全是lexsorted tuple len(2),lexsort depth(1)'