我有一个
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
有两个要求:
*
行应位于每组的第一行*
行,其他行应按price
我尝试了很多方法,但没有找到优雅的方法。在
multiindex
dataframe
中插入指定位置的行似乎很难。
你能帮忙吗?
上计算
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