看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas
的 unstack()
方法用于将 DataFrame
的行索引(尤其是多级索引)转换为列索引,将长表(行较多的表)转换为宽表(列较多的表)。该方法通常与 stack()
方法相对,常用于数据重塑。
unstack()
方法主要适用于具有多级索引的 DataFrame
或 Series
。它支持数值型、字符串型、布尔型等各种数据类型的列。
DataFrame.unstack(
level: int | str | list[int | str] = -1,
fill_value=None,
sort=True
)
调整一级(必然是分层的)索引标签。返回一个具有新级别列标签的DataFrame,其最内层由旋转索引标签组成。
如果索引不是MultiIndex,则输出将是Series(当列不是MultiIndex时,类似于堆栈)。
level:
int
、str
或 list[int | str]
-1
)。可以指定单个级别或多个级别进行 unstack
操作。如果指定多个级别,结果将拥有多个列级别。fill_value:
标量值
NaN
。sort:
bool
True
,则按字典顺序对结果的索引进行排序。默认值为 True
。DataFrame
或 Series
DataFrame
或 Series
,其中行索引被转换为列索引,列数增加。unstack()
通常在需要将数据从长表格式转换为宽表格式时使用,比如在数据透视、交叉表计算中非常有用。此外,unstack()
经常与 stack()
方法配合使用。
index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
('two', 'a'), ('two', 'b')])
s = pd.Series(np.arange(1.0, 5.0), index=index)
s
'''
one a 1.0
b 2.0
two a 3.0
b 4.0
dtype: float64
'''
s.unstack(level=-1)
'''
a b
one 1.0 2.0
two 3.0 4.0
'''
s.unstack(level=0)
'''
one two
a 1.0 3.0
b 2.0 4.0
'''
df = s.unstack(level=0)
df.unstack()
'''
one a 1.0
b 2.0
two a 3.0
b 4.0
dtype: float64
'''
下面通过几个例子来说明 unstack()
的使用。
unstack
操作假设有一个简单的多级索引 DataFrame
,其中记录了学生成绩。
import pandas as pd
# 构造示例数据
data = {
'Subject': ['Math', 'English', 'Math', 'English'],
'Score': [85, 78, 92, 81]
}
df = pd.DataFrame(data, index=['Alice', 'Alice', 'Bob', 'Bob'])
# 将 'Subject' 列设为行索引
df = df.set_index('Subject', append=True)
# 输出构造的数据
print(df)
# 将行索引转换为列索引
unstacked_df = df.unstack()
# 输出结果
print(unstacked_df)
输出:
Score
Subject
Alice Math 85
English 78
Bob Math 92
English 81
Score
Subject Math English
Alice 85 78
Bob 92 81
在这个例子中,unstack()
方法将 Subject
级别的行索引转换为列索引,使得每个学生的成绩按科目分列显示。
在一些情况下,行索引的某些组合可能缺少数据,此时 unstack()
会生成 NaN
值。可以使用 fill_value
参数填充这些缺失值。
import pandas as pd
# 构造示例数据
data = {
'Subject': ['Math', 'English', 'Math'],
'Score': [85, 78, 92]
}
df = pd.DataFrame(data, index=['Alice', 'Alice', 'Bob'])
# 将 'Subject' 列设为行索引
df = df.set_index('Subject', append=True)
# 输出构造的数据
print(df)
# 将行索引转换为列索引,并填充缺失值为 0
unstacked_df = df.unstack(fill_value=0)
# 输出结果
print(unstacked_df)
输出:
Score
Subject
Alice Math 85
English 78
Bob Math 92
Score
Subject Math English
Alice 85 78
Bob 92 0
在这个例子中,Bob
没有 English
的成绩,unstack()
操作后该位置为 NaN
,我们用 0
来填充这个缺失值。
unstack
如果有多个行索引级别,可以指定 level
参数来进行 unstack
。例如,我们可以 unstack
多个级别的行索引。
import pandas as pd
# 构造示例数据
data = {
'Year': [2022, 2022, 2023, 2023],
'Subject': ['Math', 'English', 'Math', 'English'],
'Score': [85, 78, 92, 81]
}
df = pd.DataFrame(data, index=['Alice', 'Alice', 'Bob', 'Bob'])
# 将 'Year' 和 'Subject' 列设为行索引
df = df.set_index(['Year', 'Subject'], append=True)
# 输出构造的数据
print(df)
# 将最后两个行索引级别转换为列索引
unstacked_df = df.unstack(['Year', 'Subject'])
# 输出结果
print(unstacked_df)
输出:
Score
Year Subject
Alice 2022 Math 85
English 78
Bob 2023 Math 92
English 81
Score
Year 2022 2023
Subject Math English Math English
Alice 85 78 NaN NaN
Bob NaN NaN 92 81
在这个例子中,我们将 Year
和 Subject
两个级别的行索引一起转换为列索引,使得数据结构更加宽表化。
更新时间:Aug. 11, 2024, 10:55 a.m. 标签:pandas python 堆叠 索引