Pandas 重塑

在 Pandas 中,重塑数据是指将 DataFrame 从一种格式转换为另一种格式,以实现更好的数据可视化和分析。

Pandas 提供了多种方法,如 pivot()pivot_table()stack()unstack()melt() 来重塑数据。我们可以根据分析需求选择相应的方法。


使用 pivot() 重塑数据

在 Pandas 中,pivot() 函数根据列值重塑数据。

它接收简单的列式数据作为输入,并将条目分组到一个二维表中。

让我们看一个例子。

import pandas as pd

# create a DataFrame
data = {'Date': ['2023-08-01', '2023-08-01', '2023-08-02', '2023-08-02'],
        'Category': ['A', 'B', 'A', 'B'],
        'Value': [10, 20, 30, 40]}
df = pd.DataFrame(data)

print("Original Dataframe:\n", df)

# pivot the  DataFrame
pivot_df = df.pivot(index='Date', columns='Category', values='Value')
print("Reshaped DataFrame:\n", pivot_df)

输出

Original Dataframe: 
         Date      Category  Value
0  2023-08-01        A     10
1  2023-08-01        B     20
2  2023-08-02        A     30
3  2023-08-02        B     40

Reshaped DataFrame: 
Category     A   B
Date              
2023-08-01  10  20
2023-08-02  30  40

在此示例中,我们向 pivot 函数传递了 indexcolumnsvalues 参数。此处:

  • index 指定用作透视 DataFrame 索引的列
  • columns 指定其唯一值将成为新列标题的列
  • values 指定包含要放入新列的值的列

因此,如输出所示,DataFrame 已被透视,其中 Category 列(AB)的唯一值成为单独的列。

然后,相应 Value 列的值会放置在相应的单元格中。

要了解更多信息,请访问 Pandas Pivot


使用 pivot_table() 重塑数据

Pandas 中的 pivot_table() 函数是一种用于重塑和汇总 DataFrame 中数据的方法。

它允许我们创建一个透视表,该透视表根据指定的索引、列和聚合函数来聚合和汇总数据。

让我们看一个例子。

import pandas as pd

# create a DataFrame
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Value': [10, 20, 30, 40, 50, 60]}
df = pd.DataFrame(data)
print("Original Dataframe:\n", df)

# create a pivot table
pivot_table_df = df.pivot_table(index='Category', values='Value', aggfunc='mean')
print("Reshaped Dataframe:\n", pivot_table_df)

输出

Original Dataframe: 
   Category  Value
0        A     10
1        B     20
2        A     30
3        B     40
4        A     50
5        B     60 

Reshaped Dataframe: 
Value
Category       
A          30.0
B          40.0

在上面的示例中,我们使用 pivot_table() 从原始 df DataFrame 创建了一个透视表。

pivot_table() 内部,我们传递了以下参数:

  1. index = Category - 指定 Category 列作为透视表的索引。这意味着 Category 中的每个唯一值都将成为透视表中的行索引。
  1. values = Value - 指定 Value 列作为将用于透视表聚合的值源。
  1. aggfunc = mean - 我们使用平均聚合函数来计算每个类别下 Value 列的平均值。

因此,在输出中,透视表以类别 AB 作为行索引,并显示其相应 Value 列条目的平均值。

这使得我们能够使用更紧凑、更结构化的格式快速比较不同类别的平均值。

要了解更多信息,请访问 Pandas Pivot Table


使用 stack() 和 unstack() 重塑数据

在 Pandas 中,我们还可以使用 stack()unstack() 来重塑数据。

  • stack() 用于透视列标签的一个级别,将其转换为最内层的行索引级别。
  • unstack() 用于透视行索引的一个级别,将其转换为最外层的列级别。

让我们看一个例子。

import pandas as pd

# create a DataFrame
data = {'Date': ['2023-08-01', '2023-08-02'],
        'Category_A': [10, 20],
        'Category_B': [30, 40]}
df = pd.DataFrame(data)

# set 'Date' column as the index
df.set_index('Date', inplace=True)

# stack the columns into rows
stacked_df = df.stack()
print("Stack:\n", stacked_df)
print()

# unstack the rows back to columns
unstacked_df = stacked_df.unstack()
print("Unstack: \n", unstacked_df)

输出

Stack:
Date                  
2023-08-01  Category_A    10
            Category_B    30
2023-08-02  Category_A    20
            Category_B    40
dtype: int64

Unstack: 
Category_A  Category_B
Date                              
2023-08-01          10          30
2023-08-02          20          40

这里,

  • stack() 应用于 df DataFrame,它将列标签(Category_ACategory_B)透视为新的行索引级别。
  • unstack() 应用于 stacked_df,它会反转操作,并将最内层的行索引级别透视为列。

使用 melt() 重塑 DataFrame

Pandas 中的 melt() 函数将 DataFrame 从宽格式转换为长格式。

import pandas as pd

# create a sample DataFrame
data = {'Name': ['Alice', 'Bob'],
        'Math': [90, 85],
        'History': [75, 92]}
df = pd.DataFrame(data)

# melt the DataFrame
melted_df = pd.melt(df, id_vars='Name', var_name='Subject', value_name='Score')

print(melted_df)

输出

     Name  Subject  Score
0  Alice     Math     90
1    Bob     Math     85
2  Alice  History     75
3    Bob  History     92

在此示例中,我们使用 melt() 函数将 df DataFrame 从宽格式转换为长格式。

melt() 内部,我们传递了不同的参数:

  • id_vars 指定我们希望保持不变的列。
  • var_name 指定将包含变量名(MathHistory)的新列的名称。
  • value_name 指定将包含值(分数)的新列的名称。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战