看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在pandas中,多层索引(MultiIndex)表示在行索引和列索引上使用多个索引级别。它能更好地使用股分区、组织数据,尤其是层次化的数据。一个多层索引对象包含两个或多个索引数组。
我们看一下数据:
import pandas as pd
data = {
('SKU编码', 'len'): {('A', 'a1'): 19, ('A', 'a2'): 12},
('SKU编码', 'long'): {('A', 'a1'): 54, ('A', 'a2'): 75},
('毛利率', 'min'): {('A', 'a1'): 0.0588, ('A', 'a2'): 0.0909},
('毛利率', 'max'): {('A', 'a1'): 0.122, ('A', 'a2'): 0.1071},
('毛利率', 'mean'): {('A', 'a1'): 0.0841684210526316, ('A', 'a2'): 0.098475},
('毛利率', 'median'): {('A', 'a1'): 0.0827, ('A', 'a2'): 0.0991}
}
df = pd.DataFrame(data)
df
'''
SKU编码 毛利率
len long min max mean median
A a1 19 54 0.0588 0.1220 0.084168 0.0827
a2 12 75 0.0909 0.1071 0.098475 0.0991
'''
重点关注下,列是一个多层的索引,我们现在希望对「毛利率」这一层以下的数据进行格式化,保留两位小数增加百分号,如 12.20%。
由于多层索引类似一个元组索引,但拥有名称和多个级别,我们执行 df.columns
可以看到,第一层是元组的第一个元素,因此我们在 apply() 应用格式化数据的时候,只要判断这个 Series 的 name (在 DataFrame 为列索引)的第一个元素为「毛利率」即可,否则不进行处理。
先查看一下列索引:
df.columns
'''
MultiIndex([('SKU编码', 'len'),
('SKU编码', 'long'),
( '毛利率', 'min'),
( '毛利率', 'max'),
( '毛利率', 'mean'),
( '毛利率', 'median')],
)
'''
第一层索引是元组的第一个元素,因此我们用应用格式化方法时判断它是否「毛利率」:
df.apply(lambda x: x.map('{:,.2%}'.format) if x.name[0] == '毛利率' else x)
'''
SKU编码 毛利率
len long min max mean median
A a1 19 54 5.88% 12.20% 8.42% 8.27%
a2 12 75 9.09% 10.71% 9.85% 9.91%
'''
也可以使用 style 展示格式化:
df.style.format('{:.2%}', subset=['毛利率'])
df.style.format('{:.2%}', subset=pd.IndexSlice[:, '毛利率'])
df.style.format('{:.2%}', subset=pd.IndexSlice[:, ('毛利率', slice(None))])
# 毛利率列下的部分列
df.style.format('{:.2%}', subset=pd.IndexSlice[:, ('毛利率', ['max', 'mean'])])
这样就完成了需求。
(完)
更新时间:2024-08-18 16:18:07 标签:pandas python 多层索引 格式化