代码之家  ›  专栏  ›  技术社区  ›  Nicola

按子人口百分比的多级分组

  •  0
  • Nicola  · 技术社区  · 6 年前

    让我们考虑以下数据帧:

    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号服务(=access1),这是因为考虑到A区3人有权获得1号服务,其中1名未受教育男性有权获得1号服务(=1/3)。

    然而,希望得到不同的输出。我想把A区总共4个人作为我的100%。50%的男性没有受过教育。在50%的未受过教育的男性中,有25%的人可以获得1号服务。所以,我想在表中看到的百分比是25%(A区未受教育男性进入服务1的总数)。Groupby是否是到达目的地的正确方法,以及在考虑从每个位置的引用总人口中进行分解时,衡量服务1访问率的最佳方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我认为需要分歧 D0 按映射的多索引的第一级 a 系列:

    D0=df.groupby(['Location','Gender','Edu']).sum()
    
    a = df['Location'].value_counts()
    #alternative
    #a = df.groupby(['Location']).size()
    print (a)
    A    4
    C    3
    B    2
    Name: Location, dtype: int64
    
    df1 = D0.div(D0.index.get_level_values(0).map(a.get), axis=0)
    print (df1)
                          Access1   Access2
    Location Gender Edu                    
    A        M      N    0.250000  0.500000
                    Y    0.500000  0.250000
    B        F      Y    0.500000  0.500000
             M      Y    0.000000  0.000000
    C        F      N    0.000000  0.333333
             M      Y    0.666667  0.000000
    

    细节 :

    print (D0.index.get_level_values(0).map(a.get))
    Int64Index([4, 4, 2, 2, 3, 3], dtype='int64', name='Location')