📅  最后修改于: 2023-12-03 15:22:16.952000             🧑  作者: Mango
pandas 是 Python 中最常用的数据处理库之一。其中,DataFrame 是一个常用的数据结构,它由多个 Series 组成,每个 Series 是一个列。在日常的数据处理中,有时需要根据具体的需求来对 DataFrame 进行一些重塑操作,比如将宽格式变为长格式,或者将长格式变为宽格式。在 pandas 中,我们可以使用 stack、unstack 和 melt 方法来实现这些操作。
stack 和 unstack 是用于在宽格式和长格式之间进行转换的方法。在宽格式中,每一列都对应着一个变量,而在长格式中,每一行都对应着一个变量。下面的例子将说明 stack 和 unstack 的用法。
我们先来看一个有关销售数据的示例数据,其中包含了商品的名称、类型、销售量和利润:
import pandas as pd
data = {
'Name': ['A', 'A', 'B', 'B'],
'Type': ['X', 'Y', 'X', 'Y'],
'Sales': [100, 200, 300, 400],
'Profit': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
print(df)
输出:
Name Type Sales Profit
0 A X 100 10
1 A Y 200 20
2 B X 300 30
3 B Y 400 40
我们可以使用 stack 方法将宽格式的 DataFrame 转换为长格式。其中,stack 方法会将 DataFrame 中的列名转换为行索引,并创建新的列索引。下面的例子将说明 stack 的用法:
df_stack = df.set_index(['Name', 'Type']).stack().reset_index()
df_stack.columns = ['Name', 'Type', 'Variable', 'Value']
print(df_stack)
输出:
Name Type Variable Value
0 A X Sales 100
1 A X Profit 10
2 A Y Sales 200
3 A Y Profit 20
4 B X Sales 300
5 B X Profit 30
6 B Y Sales 400
7 B Y Profit 40
我们可以看到, df_stack 中新增了一个名为 Variable 的列,其中记录了原 DataFrame 中的列名(Sales 和 Profit),Value 则是原 DataFrame 中的值。
我们可以使用 unstack 方法将长格式的 DataFrame 转换为宽格式。其中,unstack 方法会将 DataFrame 中的行索引转换为列索引,并创建新的行索引。下面的例子将说明 unstack 的用法:
df_unstack = df_stack.set_index(['Name', 'Type', 'Variable']).unstack('Variable')
df_unstack.columns = df_unstack.columns.get_level_values(1)
df_unstack = df_unstack.reset_index()
print(df_unstack)
输出:
Variable Name Type Profit Sales
0 A X 10 100
1 A Y 20 200
2 B X 30 300
3 B Y 40 400
我们可以看到, df_unstack 中的 Profit 和 Sales 成为了新的列名,并且 Name 和 Type 组成了新的行索引。
melt 方法可以将宽格式的 DataFrame 转换为长格式,其中宽格式的列名会被转换为另一个列中的值。下面的例子将说明 melt 的用法。
为了更好地说明 melt 方法的用法,我们使用一个有关天气的示例数据,其中包含了日期、最高气温、最低气温和降雨量:
import pandas as pd
data = {
'Date': ['2022-01-01', '2022-01-02'],
'High': [10, 9],
'Low': [5, 4],
'Rain': [True, False]
}
df = pd.DataFrame(data)
print(df)
输出:
Date High Low Rain
0 2022-01-01 10 5 True
1 2022-01-02 9 4 False
我们可以使用 melt 方法将宽格式的 DataFrame 转换为长格式。其中,id_vars 参数指定了要保留在原 DataFrame 中的列名,而 value_vars 参数指定了要转换为新列的列名。下面的例子将说明 melt 的用法:
df_melt = df.melt(id_vars=['Date'], value_vars=['High', 'Low', 'Rain'])
df_melt.columns = ['Date', 'Variable', 'Value']
print(df_melt)
输出:
Date Variable Value
0 2022-01-01 High 10
1 2022-01-02 High 9
2 2022-01-01 Low 5
3 2022-01-02 Low 4
4 2022-01-01 Rain True
5 2022-01-02 Rain False
我们可以看到, df_melt 中新增了一个名为 Variable 的列,其中记录了原 DataFrame 中的列名(High、Low 和 Rain),Value 则是原 DataFrame 中的值。
本文介绍了 pandas 中的 stack、unstack 和 melt 方法,这三个方法在 DataFrame 的重塑操作中非常有用,可以灵活地操纵数据的形式。无论是从宽格式到长格式,还是从长格式到宽格式,都可以使用这些方法实现转换。