汇总多索引pandas DataFrame

时间:2017-01-26 11:34:23

标签: python pandas dataframe multi-index

假设我使用df.set_index('Class','subclass')创建以下数据框,请记住有多个具有子类的类... A> Z.

Class   subclass    
  A       a           
  A       b 
  A       c 
  A       d 
  B       a            
  B       b 

我如何计算类中的子类并创建一个名为no的单独列,以便我可以看到具有最大子类数的Class?我正在考虑某种for循环,它贯穿Class字母,并且如果该Class字母仍然相同则计算子类。然而,对于这样的问题,这似乎有点违反直觉。是否会有更简单的方法,例如df.groupby [] .count?

所需的输出是:

Class   subclass    No. of classes
  A       a                4    
  A       b 
  A       c 
  A       d 
  B       a                2    
  B       b 

我已经尝试了group multi-index pandas dataframe中显示的level参数,但这对我来说似乎不起作用

编辑:

我没有提到我想要返回具有最多子类的Class。我通过以下方式实现了这一目标:

df.reset_index().groupby('Class')['subclass'].nunique().idxmax()

2 个答案:

答案 0 :(得分:3)

您可以使用transform,但获取重复值:

df['No. of classes'] = df.groupby(level='Class')['val'].transform('size')

print (df)
                val  No. of classes
Class subclass                     
A     a           1               4
      b           4               4
      c           5               4
      d           4               4
B     a           1               2
      b           2               2

但如果需要空值:

df['No. of classes'] = df.groupby(level='Class')
                         .apply(lambda x: pd.Series( [len(x)] + [np.nan] * (len(x)-1)))
                         .values
print (df)
                val  No. of classes
Class subclass                     
A     a           1             4.0
      b           4             NaN
      c           5             NaN
      d           4             NaN
B     a           1             2.0
      b           2             NaN

get Class的另一个解决方案是:{/ p>

df = df.groupby(level=['Class'])
       .apply(lambda x: x.index.get_level_values('subclass').nunique())
       .idxmax()
print (df)
A

答案 1 :(得分:2)

您可以使用transform将汇总计算作为新列添加回原始df:

In [165]:
df['No. of classes'] = df.groupby('Class')['subclass'].transform('count')
df

Out[165]:
  Class subclass  No. of classes
0     A        a               4
1     A        b               4
2     A        c               4
3     A        d               4
4     B        a               2
5     B        b               2