Pandas透视表组摘要

时间:2016-06-03 11:58:35

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

给出以下数据框:

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

2 个答案:

答案 0 :(得分:1)

您可以通过分组'组来实现这一目标。生成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

答案 1 :(得分: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