python pandas数据堆叠
0 背景
数据堆叠(stack()
)和解堆叠(unstack()
)是 Pandas 中处理多级索引DataFrame 的两个重要方法,它们用于改变数据的形状。这两个方法在数据重塑和透视表操作中非常有用。
数据堆叠为了将 DataFrame 的列索引转换成行索引,通常用于将宽格式数据转换成长格式。可以简单理解成将多列数据转为一列数据的过程。用于增加 DataFrame 的层级深度,使数据集更加“纵向”。
解堆叠与堆叠相反, 是为了将 DataFrame 的行索引转换成列索引,通常用于将长格式数据转换成宽格式。用于减少 DataFrame 的层级深度,使数据集更加“横向”。
什么时候会用到呢? 比如我们有一份报表数据是从1994-2024年的数据, 如果将每一年作为列, 那样就会有30个数据列, 在一些情况下, 列数太多就不便于展示, 因为此时, 我们可以使用数据堆叠, 将所有的年份压缩到一列里面去。
1 使用
参数说明
stack()
返回DataFrame or Series
def stack(
self,
level: IndexLabel = -1,
dropna: bool | lib.NoDefault = lib.no_default,
sort: bool | lib.NoDefault = lib.no_default,
future_stack: bool = False,
) -> DataFrame or Series
-
level: 默认为 -1,表示最内层的索引。它决定了哪个级别的列索引会被转换为行索引。可以是列索引的级别名称或数字。例如,如果我们的 DataFrame 有多级列索引,我们可以选择要堆叠哪一级的列。 -
dropna: 默认为 True,意味着在堆叠过程中会删除所有含有缺失值的行。如果设置为 False,则即使是缺失值也会被保留。 -
sort: 该参数决定了堆叠操作后的结果是否应该排序。如果为 True
,则结果将根据索引排序。 -
future_stack: 这是一个相对较新的参数,用于指示 stack()
方法未来的行为变化。正常情况下我们无需修改此参数。
unstack()
结果返回一个DataFrame
.
def unstack(
self,
level: IndexLabel = -1,
fill_value: Hashable | None = None,
sort: bool = True,
) -> DataFrame
-
level: 默认为 -1,表示最内层的索引。这个参数决定了哪个级别的行索引会被转换为列索引。可以是行索引的级别名称或数字。 -
fill_value: 当我们使用 unstack()
时,如果某些组合在原始数据中不存在,将会产生缺失值。fill_value
可以用来指定这些缺失值的替代值。 -
sort: 该参数决定了解堆叠操作后的结果是否应该排序。如果为 True
,则结果将根据索引排序。
初始化数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
'姓名': ['徐坤', '蔡坤', '蔡徐'],
'年龄': [28, 34, 45],
'邮箱': ['xukun@orange.com', 'caikun@apple.com', 'caixu@orange.com']
})
姓名 | 年龄 | 邮箱 | |
---|---|---|---|
0 | 徐坤 | 28 | xukun@orange.com |
1 | 蔡坤 | 34 | caikun@apple.com |
2 | 蔡徐 | 45 | caixu@orange.com |
数据堆叠
我们先将姓名
列设置为索引
df_ = df.set_index('姓名')
姓名 |
年龄 |
邮箱 |
---|---|---|
徐坤 | 28 | xukun@orange.com |
蔡坤 | 34 | caikun@apple.com |
蔡徐 | 45 | caixu@orange.com |
one = df_.stack()
one
姓名 |
<unnamed> |
|
---|---|---|
徐坤 | 年龄 | 28 |
邮箱 | xukun@orange.com | |
蔡坤 | 年龄 | 34 |
邮箱 | caikun@apple.com | |
蔡徐 | 年龄 | 45 |
邮箱 | caixu@orange.com |
看一下它的类型, 是一个Series
序列.
type(one)
'''
pandas.core.series.Series
'''
看一下索引和值, 索引是一个多级索引.
one.index
'''
MultiIndex([('徐坤', '年龄'),
('徐坤', '邮箱'),
('蔡坤', '年龄'),
('蔡坤', '邮箱'),
('蔡徐', '年龄'),
('蔡徐', '邮箱')],
names=['姓名', None])
'''
one.values
'''
array([28, 'xukun@orange.com', 34, 'caikun@apple.com', 45,
'caixu@orange.com'], dtype=object)
'''
解堆叠
上面的 one
是我们堆叠后的数据, 因此我们直接对该数据进行解堆叠操作
one.unstack()
姓名 |
年龄 |
邮箱 |
---|---|---|
徐坤 | 28 | xukun@orange.com |
蔡坤 | 34 | caikun@apple.com |
蔡徐 | 45 | caixu@orange.com |
解堆叠后生成的是一个DataFrame。
2 关于
数据的堆叠和解堆叠分别用来解决数据的展开和收缩的问题。堆叠将数据转换成一维形式,使我们能够从不同的维度观察和使用数据。与此相反,解堆叠则是堆叠的相反过程。
如果你觉得这期内容不错的话, 欢迎点赞, 在看, 关注我的微信公众号
原文始发于微信公众号(其之):python pandas数据堆叠
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204734.html