数据分析必备:DataFrame多层级索引与数据操作技巧

在数据分析中,Pandas 的多层级索引(MultiIndex)功能允许用户创建复杂的数据结构,以便更好地组织和分析数据。多层级的 DataFrame 使得在多个维度上进行数据访问和操作变得更加灵活和高效。通过使用类似于 groupby 和 agg 的方法,用户可以轻松地对数据进行分组统计和描述性分析。掌握多层级的 DataFrame 是进行高级数据分析的重要技能,能够帮助分析师深入挖掘数据中的潜在信息。

1、分层索引

分层索引是 DataFrame 的重要特性,允许你在每个轴向上都可以拥有多个(两个或两个以上)索引层级。笼统地说,分层索引提供了一种在更低维度的形式中处理更高维度数据的方式。如下所示,我们看一个简单的分层索引的 DataFrame 对象

frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
                        index=[['a', 'a', 'b', 'b'], ['one','two','one','two']],
                        columns=[['col1', 'col1', 'col2'],
                        ['red', 'red', 'green']])
frame

# ---- 输出 ----
# 		col1	col2
#       red	red	green
# a	one	0	1	2
#   two	3	4	5
# b	one	6	7	8
#   two	9	10	11

我们可以通过 index 属性获取到 DataFrame 对象的行索引、通过 columns 属性获取到 DataFrame 对象的列索引, 如下所示,输出的是一个以 MultiIndex 对象的索引

frame.index
# ---- 输出 ----
# MultiIndex([('a', 'one'),
#             ('a', 'two'),
#             ('b', 'one'),
#             ('b', 'two')],)

frame.columns
# ---- 输出 ----
# MultiIndex([('col1',   'red'),
#             ('col1',   'red'),
#             ('col2', 'green')],)

当然分成的级别也可以有名字,我们可以在创建 DataFrame 对象时,定义行索引和列索引的名字,如下所示

index = pd.MultiIndex.from_tuples(
    [('a', 'one'), ('a', 'two'), ('b', 'one'), ('b', 'two')],
    names=['first', 'second']  # 设置索引名称
)

columns = pd.MultiIndex.from_tuples(
    [('col1', 'red'), ('col1', 'green'), ('col2', 'blue')],
    names=['main', 'sub']  # 设置列名称
)

# 创建 DataFrame
data = np.arange(12).reshape((4, 3))
frame = pd.DataFrame(data, index=index, columns=columns)
frame.index
# ---- 输出 ----
# MultiIndex([('a', 'one'),
#             ('a', 'two'),
#             ('b', 'one'),
#             ('b', 'two')],
#            names=['first', 'second'])

frame.columns
# ---- 输出 ----
# MultiIndex([('col1',   'red'),
#             ('col1', 'green'),
#             ('col2',  'blue')],
#            names=['main', 'sub'])
2、多层级数据获取

与 DataFrame 的基本查询一样,我们可以通过行索引和列索引组合进行数据查询,如下所示

# 获取分组
frame.loc['a']
# ---- 输出 ----
#      col1	   col2
#      red red green
# one	0	1	2
# two	3	4	5


# 获取整行
frame.loc['a', 'two']
# ---- 输出 ----
# col1  red      3
#       red      4
# col2  green    5
# Name: (a, two), dtype: int32


# 获取具体位置的值
frame.loc[('a', 'one'), ('col1', 'red')]
# ---- 输出 ----
# col1  red    0
#       red    1
# Name: (a, one), dtype: int32
3、调换和层级排序

如果我们想对层级进行调换,可以使用 swaplevel 接收两个层级序号或层级名称,返回一个进行了层级变更的新对象(但是数据是不变的):

frame.swaplevel('first', 'second')

如果我们想根据层级名称进行排序,我们可以使用 sort_index 可以根据单一层级上对数据进行排序。

frame.sort_index(level=1)

4、按层级进行汇总统计

DataFrame 中按层级进行描述性和汇总性统计可以通过 groupby 进行汇总,再调用描述性和汇总性统计的方法,如下所示,是按行索引层级进行计数统计,其它的描述性和汇总性统计的使用类似,我们不再分别赘述。

frame.groupby('first').count()

当然我们也可以按列索引层级进行计数统计,如下所示

frame.groupby('first')['col1'].count()


如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python技术极客,我们会持续更新分享 Python 开发编程、数据分析、数据挖掘、AI 人工智能、网络爬虫等技术文章!让大家在Python 技术领域持续精进提升,成为更好的自己!

添加作者微信(coder_0101),拉你进入行业技术交流群,进行技术交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder_风逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值