【问题标题】:Pandas pivot table group summaryPandas 数据透视表组摘要
【发布时间】:2016-06-03 11:58:35
【问题描述】:

给定以下数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame({'group':['s','s','s','p','p','p'],
                   'section':['a','b','b','a','a','b']
                   })

    group   section
0     s     a
1     s     b
2     s     b
3     p     a
4     p     a
5     p     b

我想要计算每组的节数以及每组每节的最大行数。像这样:

  group section count   max min
    s      2            2    1
    p      2            2    1

【问题讨论】:

    标签: python-3.x pandas pivot-table


    【解决方案1】:

    你可以使用的IIUC:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'group':['s','s','s','s','p','p','p','p','p'],
                       'section':['b','b','b','a','a','b','a','a','b']
                       })
    print (df)
      group section
    0     s       b
    1     s       b
    2     s       b
    3     s       a
    4     p       a
    5     p       b
    6     p       a
    7     p       a
    8     p       b
    
    print (df.groupby(['group', 'section']).size() )
    group  section
    p      a          3
           b          2
    s      a          1
           b          3
    dtype: int64
    
    print (df.groupby(['group', 'section']).size().groupby(level=1).agg([len, min, max]) ) 
             len  min  max
    section               
    a          2    1    3
    b          2    2    3
    

    或者您可以将len 更改为nunique

    print (df.groupby(['group', 'section']).size().groupby(level=1).agg(['nunique', min, max]) ) 
             nunique  min  max
    section                   
    a              2    1    3
    b              2    2    3
    

    或者需要一级多索引:

    print (df.groupby(['group', 'section']).size().groupby(level=0).agg([len, min, max]) ) 
           len  min  max
    group               
    p        2    2    3
    s        2    1    3
    
    print (df.groupby(['group', 'section']).size().groupby(level=0).agg(['nunique', min, max]) ) 
           nunique  min  max
    group                   
    p            2    2    3
    s            2    1    3
    

    【讨论】:

      【解决方案2】:

      您可以通过在“组”上分组生成 value_counts 然后再次分组来实现此目的:

      In [91]:
      df.groupby('group')['section'].apply(pd.Series.value_counts).groupby(level=1).agg(['nunique','max','min'])
      
      Out[91]:
         nunique  max  min
      a        2    2    1
      b        2    2    1
      

      要接近预期结果,您可以这样做:

      In [102]:
      df.groupby('group')['section'].apply(pd.Series.value_counts).reset_index().drop('level_1', axis=1).groupby('group',as_index=False).agg(['nunique','max','min'])
      
      Out[102]:
            section        
            nunique max min
      group                
      p           2   2   1
      s           2   2   1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-17
        • 1970-01-01
        • 2023-03-23
        • 2015-08-21
        • 2020-06-05
        • 2015-01-12
        • 2012-05-22
        相关资源
        最近更新 更多