Pandas Python:group by之后的索引不正确,对列集合的聚合不同

Pandas Python:group by之后的索引不正确,对列集合的聚合不同,pandas,indexing,filter,group-by,aggregate,Pandas,Indexing,Filter,Group By,Aggregate,我想按CurrentDate、Car字段分组,并应用以下功能: np.mean函数到['Attr1',…'Attr5']列的列表 np.随机用于工厂列 这里介绍了df的示例: Index Car Attr1 Attr2 Attr3 Attr4 Attr5 AttrFactory CurrentDate 0 Nissan 0.0 1.7 3.7 0.0 6.8

我想按
CurrentDate、Car
字段分组,并应用以下功能:

  • np.mean
    函数到
    ['Attr1',…'Attr5']
    列的列表

  • np.随机
    用于
    工厂

  • 这里介绍了
    df
    的示例:

    Index   Car       Attr1    Attr2  Attr3  Attr4  Attr5  AttrFactory  CurrentDate                           
    0      Nissan     0.0       1.7    3.7    0.0    6.8      F1          01/07/18
    1      Nissan     0.0       1.7    3.7    0.0    6.8      F2          01/07/18
    2      Nissan     0.0       1.7    3.7    0.0    6.8      F3          03/08/18
    3      Porsche    10.0      0.0    2.8    3.5    6.5      F2          05/08/18
    4      Porsche    10.0      2.0    0.8    3.5    6.5      F1          05/08/18   
    5      Golf       0.0       1.7    3.0    2.0    6.3      F4          07/09/18       
    6      Tiguan     1.0       0.0    3.0    5.2    5.8      F5          10/09/18         
    7      Porsche    0.0       0.0    3.0    4.2    7.8      F4          12/09/18     
    8      Tiguan     0.0       0.0    0.0    7.2    9.0      F3          13/09/18    
    9      Golf       0.0       3.0    0.0    0.0    4.8      F5          25/09/18 
    10     Golf       0.0       3.0    0.0    0.0    4.8      F1          25/09/18  
    11     Golf       0.0       3.0    0.0    0.0    4.8      F3          25/09/18   
    
    我尝试通过以下代码执行此操作:

    metric_cols = df.filter(regex='^Attr',axis=1).columns #it's list of all Attr columns;
    
    addt_col = list(df.filter(regex='^Attr',axis=1).columns).remove('AttrFactory')
    
    
    df_gr = df.groupby(['CurrentDate', 'Car'], as_index=False)[metric_cols].agg({addt_col: np.mean, 'AttrFactory': lambda x: x.iloc[np.random.choice(range(0,len(x)))]})
    
    在结果中,我收到了带有inctorrect索引的
    df

    CurrentDate     Car          NaN
                             CurrentDate   Car    Attr1  Attr2  Attr3  Attr4  Attr5 AttrFactory                           
    01/07/18      Nissan       01/07/18   Nissan    0.0   1.7    3.7    0.0    6.8      F1                   
    03/08/18      Nissan       03/08/18   Nissan    0.0   1.7    3.7    0.0    6.8      F3          
    05/08/18      Porsche      05/08/18   Porsche   10.0  1.0    1.8    3.5    6.5      F1                    
      ...           ...         ...        ...      ...   ...    ...    ...    ...      ...  
    13/09/18      Tiguan       13/09/18   Tiguan    0.0   0.0    0.0    7.2    9.0      F3          
    25/09/18      Golf         25/09/18   Golf      0.0   1.0    0.0    0.0    4.8      F3           
    
    预期输出为df\U gr:

                               Attr1  Attr2  Attr3  Attr4  Attr5  AttrFactory                           
    01/07/18      Nissan        0.0    1.7    3.7    0.0    6.8       F1                   
    03/08/18      Nissan        0.0    1.7    3.7    0.0    6.8       F3          
    05/08/18      Porsche       10.0   1.0    1.8    3.5    6.5       F1                    
      ...         ...           ...    ...    ...    ...    ...       ...      
    13/09/18      Tiguan        0.0    0.0    0.0    7.2    9.0       F3          
    25/09/18      Golf          0.0    1.0    0.0    0.0    4.8       F3           
    
    如何修复结果顶部不正确的索引?
    如果您有任何想法,我将不胜感激,谢谢)

    您可以为您的聚合创建一个字典,并将它们传递到agg

    在:

    输出:


    您可以制作聚合的字典并将它们传递到agg

    在:

    输出:


    聚合器按列应用,因此存储在级别2,而列名存储在级别1(以防止覆盖)。这在每列应用多个聚合器时特别有用

    解决方案如下:

    # Merge the aggregator with the column name
    df_gr.columns = ['_'.join(x) for x in df_gr.columns.values.reshape(-1)]
    

    聚合器按列应用,因此存储在级别2,而列名存储在级别1(以防止覆盖)。这在每列应用多个聚合器时特别有用

    解决方案如下:

    # Merge the aggregator with the column name
    df_gr.columns = ['_'.join(x) for x in df_gr.columns.values.reshape(-1)]
    
    # Merge the aggregator with the column name
    df_gr.columns = ['_'.join(x) for x in df_gr.columns.values.reshape(-1)]