Pandas 多层次分组(按子总体百分比) 让我们考虑下面的数据框: df = {'Location': ['A','A','B','B','C','C','A','C','A'], 'Gender'['M','M','F','M','M','F','M','M','M'], 'Edu'['N','N','Y','Y','Y','N','Y','Y','Y'], 'Access1': [1,0,1,0,1,0,1,1,1], 'Access2': [1,1,1,0,0,1,0,0,1] } df = pd.DataFrame(data=d, dtype=np.int8) Access1 Access2 Edu Gender Location 0 1 1 N M A 1 0 1 N M A 2 1 1 Y F B 3 0 0 Y M B 4 1 0 Y M C 5 0 1 N F C 6 1 0 Y M A 7 1 0 Y M C 8 1 1 Y M A

Pandas 多层次分组(按子总体百分比) 让我们考虑下面的数据框: df = {'Location': ['A','A','B','B','C','C','A','C','A'], 'Gender'['M','M','F','M','M','F','M','M','M'], 'Edu'['N','N','Y','Y','Y','N','Y','Y','Y'], 'Access1': [1,0,1,0,1,0,1,1,1], 'Access2': [1,1,1,0,0,1,0,0,1] } df = pd.DataFrame(data=d, dtype=np.int8) Access1 Access2 Edu Gender Location 0 1 1 N M A 1 0 1 N M A 2 1 1 Y F B 3 0 0 Y M B 4 1 0 Y M C 5 0 1 N F C 6 1 0 Y M A 7 1 0 Y M C 8 1 1 Y M A,pandas,frequency,percentage,pandas-groupby,multi-level,Pandas,Frequency,Percentage,Pandas Groupby,Multi Level,数据帧的输出: df = {'Location': ['A','A','B','B','C','C','A','C','A'], 'Gender'['M','M','F','M','M','F','M','M','M'], 'Edu'['N','N','Y','Y','Y','N','Y','Y','Y'], 'Access1': [1,0,1,0,1,0,1,1,1], 'Access2': [1,1,1,0,0,1,0,0,1] } df = pd.DataFrame(data=d, dty

数据帧的输出:

df = {'Location': ['A','A','B','B','C','C','A','C','A'],
'Gender'['M','M','F','M','M','F','M','M','M'],
'Edu'['N','N','Y','Y','Y','N','Y','Y','Y'],
'Access1': [1,0,1,0,1,0,1,1,1], 'Access2': [1,1,1,0,0,1,0,0,1] }
df = pd.DataFrame(data=d, dtype=np.int8)
   Access1  Access2 Edu Gender Location
0        1        1   N      M        A
1        0        1   N      M        A
2        1        1   Y      F        B
3        0        0   Y      M        B
4        1        0   Y      M        C
5        0        1   N      F        C
6        1        0   Y      M        A
7        1        0   Y      M        C
8        1        1   Y      M        A
然后我用groupby来分析df中的频率

D0=df.groupby(['Location','Gender','Edu']).sum()
((D0/ D0.groupby(level = [0]).transform(sum))*100).round(3).astype(str) + '%'
输出:

                     Access1  Access2
Location Gender Edu                  
A        M      N    33.333%  66.667%
                Y    66.667%  33.333%
B        F      Y     100.0%   100.0%
         M      Y       0.0%     0.0%
C        F      N       0.0%   100.0%
         M      Y     100.0%     0.0%
根据这一结果,我推断,位置A中33.3%的未受教育男子获得服务1=访问1是考虑到位置A中有3人获得服务1的结果,其中1名未受教育男子获得服务1=1/3

然而,我们希望获得不同的输出。我想考虑总共有4个人在A位置作为我的100%。这类男性中有50%没有受过教育。在这50%的未受过教育的男性中,25%有机会获得服务1。所以,我想在表中看到的百分比是A区未受过教育的男性总数的25%,他们使用服务1。groupby是否是到达目的地的正确方法,在考虑从每个地点的参考总人口中进行分类时,衡量服务1访问率的最佳方法是什么

我认为需要将D0除以一系列映射的多索引的第一级:

详情:


这75%是从哪里来的?为什么3个人可以使用服务1?从您受过教育的男性看来,似乎只有2人可以访问1,即第6行和第8行。您是正确的,我根据该反馈对其进行了编辑。我希望在输出的第一行中看到A区访问服务1的男性总人数中未受教育男性的百分比。这很有用,但我会得到ValueError:操作数不能与形状一起广播。。。。如果我在数据集中有一些空白。如何管理它?@Nicola-你的pandas vesrion是什么?版本:'0.20.3'@Nicola-我在pandas 0.23.1中进行了测试,效果很好。