Python 多级指数聚合

Python 多级指数聚合,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个数据帧,它有两个级别的列索引。我需要在两个键(列)上使用不同的聚合函数。但是,我收到了我的代码错误。如何在多级数据帧中聚合多个列 dic1 = {('count', 'N.A.'): {Period('1993-01', 'M'): 0, Period('1993-02', 'M'): 0, Period('1993-03', 'M'): 0}, ('count', 'No'): {Period('1993-01', 'M'): 1, Period('1993-02', '

我有一个数据帧,它有两个级别的列索引。我需要在两个键(列)上使用不同的聚合函数。但是,我收到了我的代码错误。如何在多级数据帧中聚合多个列

dic1 = {('count', 'N.A.'): {Period('1993-01', 'M'): 0,
  Period('1993-02', 'M'): 0,
  Period('1993-03', 'M'): 0},
 ('count', 'No'): {Period('1993-01', 'M'): 1,
  Period('1993-02', 'M'): 1,
  Period('1993-03', 'M'): 1},
 ('count', 'Yes'): {Period('1993-01', 'M'): 0,
  Period('1993-02', 'M'): 0,
  Period('1993-03', 'M'): 0},
 ('sum', 'N.A.'): {Period('1993-01', 'M'): nan,
  Period('1993-02', 'M'): nan,
  Period('1993-03', 'M'): nan},
 ('sum', 'No'): {Period('1993-01', 'M'): 6.5820000000000007,
  Period('1993-02', 'M'): 131.1865,
  Period('1993-03', 'M'): 133.31049999999999},
 ('sum', 'Yes'): {Period('1993-01', 'M'): nan,
  Period('1993-02', 'M'): nan,
  Period('1993-03', 'M'): nan}}

df1 = pd.DataFrame(dic1)

df1.to_timestamp(how='end').groupby(pd.TimeGrouper('A') ).agg(
{'count':['max', 'min', 'median', 'last'] , 
 'sum':['mean', 'max' , 'last']} )

error:  KeyError: 'sum' 

一种简单的方法是分别取出所有的count和sum列:

In [11]: agg_dict = {col: ['mean', 'max' , 'median', 'last'] for col in df1.columns[df1.columns.get_level_values(0) == "count"]}

In [12]: agg_dict.update({col: ['mean', 'max' , 'last'] for col in df1.columns[df1.columns.get_level_values(0) == "sum"]})

In [13]: g = df1.to_timestamp(how='end').groupby(pd.TimeGrouper('A') )

In [14]: g.agg(agg_dict)
Out[14]:
            sum                                                       count
           N.A.                  No                      Yes           N.A.                   No                  Yes
           mean max last       mean       max      last mean max last  mean max median last mean max median last mean max median last
1993-12-31  NaN NaN  NaN  90.359667  133.3105  133.3105  NaN NaN  NaN     0   0      0    0    1   1      1    1    0   0      0    0

可以在分组前展平列多重索引:

df1 = pd.DataFrame(dic1)
df2 = df1.to_timestamp(how='end')
df2 = df2.rename_axis(['operation', 'YN'], axis=1)
df3 = df2.stack(level='YN').reset_index('YN')
# operation     YN  count       sum
# 1993-01-31  N.A.      0       NaN
# 1993-01-31    No      1    6.5820
# 1993-01-31   Yes      0       NaN
# 1993-02-28  N.A.      0       NaN
# 1993-02-28    No      1  131.1865
# 1993-02-28   Yes      0       NaN
# 1993-03-31  N.A.      0       NaN
# 1993-03-31    No      1  133.3105
# 1993-03-31   Yes      0       NaN
YN
列索引级别移动到列中后(通过调用
stack/reset\u index
),您可以用通常的方法解决问题:


屈服

            sum                                                      count  \
           mean                 max               last                 max   
YN         N.A.         No Yes N.A.        No Yes N.A.        No Yes  N.A.   
1993-12-31  NaN  90.359667 NaN  NaN  133.3105 NaN  NaN  133.3105 NaN     0   

           ...                                            
           ...      min        median        last         
YN         ... Yes N.A. No Yes   N.A. No Yes N.A. No Yes  
1993-12-31 ...   0    0  1   0      0  1   0    0  1   0  

谢谢<代码>重置索引(-1)用于重复日期还是具有其他功能?将索引(如果是多索引,则为多索引的一个或多个级别)移动到数据帧的列<代码>重置索引(-1)将多索引的最后一级移动到一列。在本例中,它将
YN
索引级别移动到同名的新列中<代码>重置索引(-1)在最后一级没有名称时非常有用。在这里,我应该使用
reset_index('YN')
,因为这更具描述性。将列索引(或列多索引的级别)移动到行索引。同时,
stack
后跟
reset\u index
将列索引的一个级别移动到新的数据框列中。数据框中的数据根据需要进行自我调整,以适应列和行索引的形状。调用
stack
时添加了新行(具有重复日期),因为每个日期对应3个
YN
值。另请参见doc.Nive!谢谢@unutbu
            sum                                                      count  \
           mean                 max               last                 max   
YN         N.A.         No Yes N.A.        No Yes N.A.        No Yes  N.A.   
1993-12-31  NaN  90.359667 NaN  NaN  133.3105 NaN  NaN  133.3105 NaN     0   

           ...                                            
           ...      min        median        last         
YN         ... Yes N.A. No Yes   N.A. No Yes N.A. No Yes  
1993-12-31 ...   0    0  1   0      0  1   0    0  1   0