如何为排序的多索引数据框添加一行?

问题描述 投票:0回答:1

我有一个

multiindex
dataframe
,来自
groupby

这是一个演示:

In [54]: df = pd.DataFrame({'color': ['blue', 'grey', 'blue', 'grey', 'black'], 'name': ['pen', 'pen', 'pencil', 'pencil', 'box'],'price':[2.5, 2.3, 1.5, 1.3, 5.2],'bprice':[2.2, 2, 1.3, 1.2, 5.0]})

In [55]: df
Out[55]: 
   color    name  price  bprice
0   blue     pen    2.5     2.2
1   grey     pen    2.3     2.0
2   blue  pencil    1.5     1.3
3   grey  pencil    1.3     1.2
4  black     box    5.2     5.0

In [56]: a = df.groupby(['color', 'name'])[['price', 'bprice']].sum()

In [57]: a
Out[57]: 
              price  bprice
color name                 
black box       5.2     5.0
blue  pen       2.5     2.2
      pencil    1.5     1.3
grey  pen       2.3     2.0
      pencil    1.3     1.2

我想在每个颜色索引中添加一行,理想的输出是:

              price  bprice
color name                 
black *         5.2     5.0
      box       5.2     5.0
blue  *         4.0     3.5
      pen       2.5     2.2
      pencil    1.5     1.3
grey  *         3.6     3.2
      pen       2.3     2.0
      pencil    1.3     1.2

有两个要求:

  1. 新的
    *
    行应位于每组的第一行
  2. 除了
    *
    行,其他行应按
    price
  3. 排序

我尝试了很多方法,但没有找到优雅的方法。在

multiindex
dataframe
中插入指定位置的行似乎很难。

你能帮忙吗?

python pandas
1个回答
0
投票

groupby.sum

 上计算 
a
,然后用 
*
concat
附加一个级别,最后基于 sort_index
 计算 
color

out = (pd.concat([a.groupby('color').sum()
                   .assign(name='*')
                   .set_index('name', append=True),
                  a])
         .sort_index(level='color', kind='stable',
                     sort_remaining=False)
      )

输出:

              price  bprice
color name                 
black *         5.2     5.0
      box       5.2     5.0
blue  *         4.0     3.5
      pen       2.5     2.2
      pencil    1.5     1.3
grey  *         3.6     3.2
      pen       2.3     2.0
      pencil    1.3     1.2
© www.soinside.com 2019 - 2024. All rights reserved.