📜  使用 stack、unstack 和 melt 方法重塑 pandas DataFrame(1)

📅  最后修改于: 2023-12-03 15:22:16.952000             🧑  作者: Mango

使用 stack、unstack 和 melt 方法重塑 pandas DataFrame

pandas 是 Python 中最常用的数据处理库之一。其中,DataFrame 是一个常用的数据结构,它由多个 Series 组成,每个 Series 是一个列。在日常的数据处理中,有时需要根据具体的需求来对 DataFrame 进行一些重塑操作,比如将宽格式变为长格式,或者将长格式变为宽格式。在 pandas 中,我们可以使用 stack、unstack 和 melt 方法来实现这些操作。

stack 和 unstack

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

我们可以使用 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

我们可以使用 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

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

我们可以使用 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 的重塑操作中非常有用,可以灵活地操纵数据的形式。无论是从宽格式到长格式,还是从长格式到宽格式,都可以使用这些方法实现转换。