跳到主要内容

Pandas 宽格式转换

在数据分析中,数据通常以不同的格式存储。宽格式(Wide Format)和长格式(Long Format)是两种常见的数据组织形式。宽格式数据通常具有多个列,每列代表一个变量或时间点的值,而长格式数据则将多个变量或时间点的值堆叠在一列中,并使用额外的列来标识这些值。

Pandas提供了强大的工具来在宽格式和长格式之间进行转换。本文将重点介绍如何将宽格式数据转换为长格式,以及如何在实际场景中应用这些技巧。

什么是宽格式数据?

宽格式数据通常具有以下特点:

  • 每一列代表一个变量或时间点的值。
  • 每一行代表一个观察值或记录。
  • 通常用于展示多个变量或时间点的数据。

例如,以下是一个宽格式数据的示例:

python
import pandas as pd

data = {
'Date': ['2023-01-01', '2023-01-02', '2023-01-03'],
'New York': [32, 35, 28],
'Los Angeles': [75, 77, 80],
'Chicago': [45, 48, 42]
}

df = pd.DataFrame(data)
print(df)

输出:

         Date  New York  Los Angeles  Chicago
0 2023-01-01 32 75 45
1 2023-01-02 35 77 48
2 2023-01-03 28 80 42

在这个例子中,每一列代表一个城市的温度,每一行代表一个日期的温度记录。

宽格式转换为长格式

Pandas提供了 pd.melt() 函数来将宽格式数据转换为长格式。pd.melt() 函数的主要参数包括:

  • id_vars: 需要保留的列,这些列不会进行转换。
  • value_vars: 需要转换的列,这些列将被堆叠为一列。
  • var_name: 新生成的列名,用于存储原来的列名。
  • value_name: 新生成的列名,用于存储原来的值。

让我们将上面的宽格式数据转换为长格式:

python
long_df = pd.melt(df, id_vars=['Date'], value_vars=['New York', 'Los Angeles', 'Chicago'],
var_name='City', value_name='Temperature')
print(long_df)

输出:

         Date         City  Temperature
0 2023-01-01 New York 32
1 2023-01-02 New York 35
2 2023-01-03 New York 28
3 2023-01-01 Los Angeles 75
4 2023-01-02 Los Angeles 77
5 2023-01-03 Los Angeles 80
6 2023-01-01 Chicago 45
7 2023-01-02 Chicago 48
8 2023-01-03 Chicago 42

在这个例子中,我们将 New YorkLos AngelesChicago 三列转换为一列 City,并将它们的值存储在 Temperature 列中。

实际应用场景

场景1:时间序列数据的转换

假设你有一组时间序列数据,记录了多个城市在不同日期的温度。宽格式数据可能如下:

python
data = {
'Date': ['2023-01-01', '2023-01-02', '2023-01-03'],
'New York': [32, 35, 28],
'Los Angeles': [75, 77, 80],
'Chicago': [45, 48, 42]
}

df = pd.DataFrame(data)

通过 pd.melt() 函数,你可以将数据转换为长格式,以便更容易进行分析和可视化。

场景2:多变量数据的转换

假设你有一组数据,记录了多个变量在不同时间点的值。宽格式数据可能如下:

python
data = {
'Time': ['08:00', '09:00', '10:00'],
'Temperature': [22, 24, 26],
'Humidity': [45, 50, 55],
'Pressure': [1013, 1012, 1011]
}

df = pd.DataFrame(data)

通过 pd.melt() 函数,你可以将 TemperatureHumidityPressure 三列转换为一列 Variable,并将它们的值存储在 Value 列中。

python
long_df = pd.melt(df, id_vars=['Time'], value_vars=['Temperature', 'Humidity', 'Pressure'],
var_name='Variable', value_name='Value')
print(long_df)

输出:

    Time    Variable  Value
0 08:00 Temperature 22
1 09:00 Temperature 24
2 10:00 Temperature 26
3 08:00 Humidity 45
4 09:00 Humidity 50
5 10:00 Humidity 55
6 08:00 Pressure 1013
7 09:00 Pressure 1012
8 10:00 Pressure 1011

总结

宽格式数据在数据分析中非常常见,但在某些情况下,长格式数据更便于分析和可视化。Pandas提供了 pd.melt() 函数来将宽格式数据转换为长格式数据。通过本文的学习,你应该能够理解宽格式和长格式数据的区别,并掌握如何使用 pd.melt() 函数进行数据转换。

附加资源与练习

  1. 练习1:尝试将以下宽格式数据转换为长格式数据:
python
data = {
'Year': [2020, 2021, 2022],
'Sales_A': [100, 150, 200],
'Sales_B': [300, 350, 400],
'Sales_C': [500, 550, 600]
}

df = pd.DataFrame(data)
  1. 练习2:使用 pd.melt() 函数将以下宽格式数据转换为长格式数据,并尝试将 Variable 列拆分为两个列:CategoryMetric
python
data = {
'ID': [1, 2, 3],
'Sales_2020': [100, 150, 200],
'Sales_2021': [300, 350, 400],
'Profit_2020': [50, 75, 100],
'Profit_2021': [150, 175, 200]
}

df = pd.DataFrame(data)
  1. 附加资源

通过练习和进一步的学习,你将能够更熟练地使用Pandas进行数据重塑和转换。