在 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 函数传递了 index、columns 和 values 参数。此处:
index
指定用作透视 DataFrame 索引的列columns
指定其唯一值将成为新列标题的列values
指定包含要放入新列的值的列
因此,如输出所示,DataFrame 已被透视,其中 Category
列(A
和 B
)的唯一值成为单独的列。
然后,相应 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()
内部,我们传递了以下参数:
index = Category
- 指定Category
列作为透视表的索引。这意味着Category
中的每个唯一值都将成为透视表中的行索引。
values = Value
- 指定Value
列作为将用于透视表聚合的值源。
aggfunc = mean
- 我们使用平均聚合函数来计算每个类别下Value
列的平均值。
因此,在输出中,透视表以类别 A
和 B
作为行索引,并显示其相应 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_A
和Category_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
指定将包含变量名(Math
和History
)的新列的名称。value_name
指定将包含值(分数)的新列的名称。