【问题标题】:Transforming a multi-index dataframe to retain a groupby() aggregation转换多索引数据框以保留 groupby() 聚合
【发布时间】:2018-08-13 18:55:52
【问题描述】:

问题:

我的数据框有多个列,其中包含按品牌分组的某些产品的信息。每个产品都有一些属性,在第 1 列、第 2 列等中表示。这些列各自捕获子列 min、max 和 all 中的附加信息。分组的方式是品牌和型号形成数据框的多索引

                          column 1       column 2      column 3      
brand       model         min max all    min max all   min max all    min max all

brand(1)    model(1)
            model(2)
            model(3)

brand(2)    model(1)    
  .         model(2) 
  .         model(3)
  .           .
brand(n)    

我需要向这个数据框添加一个名为第 4 列的新列,它需要拥有相同的子列 min、max 和 all,并且必须是数据框的长度。

试过了:

以下代码创建一个与原始数据帧长度相同的数据帧,其中包含new_column 列及其各自的子列min、max 和all。

columns_to_add = pd.DataFrame(index= range(len(original_df.index)), columns =  ["new_column","new_column","new_column"],["min","max","all"]])
original_df = original_df.append(columns_to_add)

但是,当我可视化我的原始数据框时,我似乎失去了我最初拥有的分组并得到了类似的东西。

                          column 1      column 2       column 3     new_column
                          min max all   min max all  min max all    min max all

(brand(1),model(1))
(brand(1),model(2))
(brand(1),model(3))

(brand(2),model(1))    
(brand(2),model(2))
(brand(2),model(3))
         .          
         .          
(brand(n),model(i))
         .           
 1410                     NaN NaN NaN   NaN NaN NaN   NaN NaN NaN   
 1411                     NaN NaN NaN   NaN NaN NaN   NaN NaN NaN                          
 1412                     NaN NaN NaN   NaN NaN NaN   NaN NaN NaN     

我不明白这些从 1410 开始的额外行是从哪里来的。我相信取消分组导致了这种情况,因此它用NaN填充了这些行。

问题:

  1. 有没有办法让我添加new_column 以保留分组?
  2. 我可以对这些用NaN 填充的新行做些什么?

编辑:

[1] 我刚刚意识到我的原始数据框有 1440 行,而包含空行的新数据框有 2880 行长,换句话说,是原始数据框长度的两倍。是什么导致行数加倍?

[2] 如何在多索引数据帧上执行transform() 以保持 groupby?这将防止我的数据帧的行数增加一倍

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    要回答您的主要问题,可以使用MultiIndex.from_product 添加带有子列的新多级列。一些测试数据来说明这个过程:

    df = pd.DataFrame({'brand': [1,1,1,1,2,2,2,2], 'model': [3,3,4,4,5,5,5,6], 'col1': [1,2,3,4,5,6,7,8], 'col2': [9,8,7,6,5,4,3,2]})
    df = df.groupby(['brand', 'model']).agg({'col1': ['min', 'max', 'mean'], 'col2': ['min', 'max', 'mean']})
    

    给出:

                    col1          col2
                min max mean  min max mean
    brand model                     
    1     3     1   2   1.5   8   9   8.5  
          4     3   4   3.5   6   7   6.5
    2     5     5   7   6.0   3   5   4.0
          6     8   8   8.0   2   2   2.0
    

    添加新的多级列:

    df = df.join(pd.DataFrame(np.random.rand(len(df),3),
                              columns=pd.MultiIndex.from_product([['new_column'], ['min','max','mean']]),
                              index=df.index))
    

    这里np.random.rand(len(df),3)是用来填数值的,但只要尺寸正确,什么都可以。此处不使用任何内容会将新列中的值设置为NaN。

    结果:

                    col1          col2            new_column
                min max mean  min max mean  min      max      mean
    brand model                     
    1     3     1   2   1.5   8   9   8.5   0.065094 0.489666 0.476452
          4     3   4   3.5   6   7   6.5   0.280267 0.237083 0.272776
    2     5     5   7   6.0   3   5   4.0   0.650988 0.384788 0.486176
          6     8   8   8.0   2   2   2.0   0.025630 0.908280 0.386871
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多