首页 文章

如何计算pandas pivot_table的计数

提问于
浏览
0

我有这样的数据

import random
import pandas as pd

jobs = ['Agriculture', 'Crafts', 'Labor', 'Professional']

df = pd.DataFrame({
    'JobCategory':[random.choice(jobs) for i in range(300)],
    'Region':[random.randint(1,5) for i in range(300)],
    'MaritalStatus':[random.choice(['Not Married', 'Married']) for i in range(300)]
})

我想要一个简单的表格,显示每个地区的工作数量 .

print(pd.pivot_table(df,
           index='JobCategory',
           columns='Region',
           margins=True,
           aggfunc=len))

输出是

MaritalStatus                               
Region                   1     2     3     4     5    All
JobCategory                                              
Agriculture           13.0  23.0  17.0  18.0   8.0   79.0
Crafts                16.0  13.0  18.0  19.0  14.0   80.0
Labor                 15.0  11.0  19.0  11.0  14.0   70.0
Professional          22.0  17.0  16.0   7.0   9.0   71.0
All                   66.0  64.0  70.0  55.0  45.0  300.0

我假设“MaritalStatus”出现在输出中,因为这是计算计数的列 . 如何根据Region-JobCategory计数让Pandas计算并忽略数据框中的无关列?

在编辑中添加---

我正在寻找一个输出边距值的表 . 我展示的表格中的值是我想要的,但我不希望MaritalStatus成为计算对象 . 如果该列中有Nan,例如将列定义更改为

'MaritalStatus':[random.choice(['Not Married', 'Married'])
                 for i in range(299)].append(np.NaN)

这是输出(有和没有 values = 'MaritalStatus',

MaritalStatus                             
Region                   1     2     3     4     5  All
JobCategory                                            
Agriculture           16.0  14.0  16.0  14.0  16.0  NaN
Crafts                25.0  17.0  15.0  14.0  16.0  NaN
Labor                 14.0  16.0   8.0  17.0  15.0  NaN
Professional          13.0  14.0  14.0  13.0  13.0  NaN
All                    NaN   NaN   NaN   NaN   NaN  0.0

4 回答

  • 2

    你可以用0填充nan值,然后找到len

    df = pd.DataFrame({
    'JobCategory':[random.choice(jobs) for i in range(300)],
    'Region':[random.randint(1,5) for i in range(300)],
    'MaritalStatus':[random.choice(['Not Married', 'Married']) for i in range(299)].append(np.NaN)})
    
    df = df.fillna(0)
    print(pd.pivot_table(df,
           index='JobCategory',
           columns='Region',
           margins=True,
           values='MaritalStatus',
           aggfunc=len))
    

    输出:

    Region                   1     2     3     4     5    All
    JobCategory                                              
    Agriculture           19.0  17.0  13.0  20.0   9.0   78.0
    Crafts                17.0  14.0   9.0  11.0  16.0   67.0
    Labor                 10.0  17.0  15.0  19.0  11.0   72.0
    Professional          11.0  14.0  19.0  19.0  20.0   83.0
    All                   57.0  62.0  56.0  69.0  56.0  300.0
    
  • 0

    len 聚合函数计算 MaritalStatus 的值沿 JobCategory - Region 的特定组合出现的次数 . 因此,你正在计算 JobCategory - Region 实例的数量,这正是你所期待的 .

  • 0

    如果将数据帧剪切为仅作为最终索引的一部分的列计数行的工作,而不必引用另一列 .

    pd.pivot_table(testdata[['JobCategory', 'Region']],
                   index='JobCategory',
                   columns='Region',
                   margins=True,
                   aggfunc=len)
    

    除了没有“MaritialStatus”的行之外,输出与问题中的输出相同 .

  • 0

    编辑

    我们可以为每个记录分配键值,并对该值进行计数或调整 .

    df = pd.DataFrame({
    'JobCategory':[random.choice(jobs) for i in range(300)],
    'Region':[random.randint(1,5) for i in range(300)],
    'MaritalStatus':[random.choice(['Not Married', 'Married']) for i in range(299)].append(np.NaN)})
    
    print(pd.pivot_table(df.assign(key=1),
               index='JobCategory',
               columns='Region',
               margins=True,
               aggfunc=len,
               values='key'))
    

    输出:

    Region           1     2     3     4     5    All
    JobCategory                                      
    Agriculture   16.0  14.0  13.0  16.0  16.0   75.0
    Crafts        14.0   9.0  17.0  22.0  13.0   75.0
    Labor         11.0  18.0  20.0  10.0  16.0   75.0
    Professional  16.0  14.0  15.0  14.0  16.0   75.0
    All           57.0  55.0  65.0  62.0  61.0  300.0
    

    您可以添加MaritalStatus作为 values 参数,这将消除列索引中的额外级别 . 使用aggfunc = len ,你选择什么作为值参数并不重要,它将为该聚合中的每一行返回1的计数 .

    所以,试试:

    print(pd.pivot_table(df,
               index='JobCategory',
               columns='Region',
               margins=True,
               aggfunc=len,
               values='MaritalStatus'))
    

    输出:

    Region           1     2     3     4     5    All
    JobCategory                                      
    Agriculture   10.0  18.0  10.0  15.0  19.0   72.0
    Crafts        11.0  13.0  17.0  11.0  22.0   74.0
    Labor         12.0  10.0  18.0  16.0  12.0   68.0
    Professional  21.0  16.0  20.0  13.0  16.0   86.0
    All           54.0  57.0  65.0  55.0  69.0  300.0
    

    选项2

    使用 groupbysize

    df.groupby(['JobCategory','Region']).size()
    

    输出:

    JobCategory   Region
    Agriculture   1         10
                  2         18
                  3         10
                  4         15
                  5         19
    Crafts        1         11
                  2         13
                  3         17
                  4         11
                  5         22
    Labor         1         12
                  2         10
                  3         18
                  4         16
                  5         12
    Professional  1         21
                  2         16
                  3         20
                  4         13
                  5         16
    dtype: int64
    

相关问题