使用Pandas Melt将Wide DataFrame重塑为带有标识符的Tidy

  • Post category:Python

下面是详细的Pandas Melt操作教程,包括Wide DataFrame的含义和Tidy DataFrame的定义、Pandas Melt函数的用法以及实例演示。

Wide DataFrame和Tidy DataFrame的含义

在开始讲解Pandas Melt函数之前,先来看一下Wide DataFrame和Tidy DataFrame的含义。

Wide DataFrame是指表格中每一列都代表一种变量,比如一个销售数据表可能包含销售日期、销售人员、销售额等若干列,每一列都代表不同的变量。

而Tidy DataFrame则是指每一行都代表一个观测值,并且每一列都代表一个变量。在Tidy DataFrame中,通常需要使用一个列来唯一标识每个观测值,这个列一般被称为”标识符”。

可以看到,Wide DataFrame的列数通常会比较多,而Tidy DataFrame则更加便于各种数据分析操作。因此,当Wide DataFrame需要进行进一步处理时,通常需要先将其转换为Tidy DataFrame。

操作步骤

Pandas库提供了Melt函数,可以将Wide DataFrame重塑为Tidy DataFrame。具体操作步骤如下:

  1. 导入Pandas库,读取Wide DataFrame
  2. 使用Melt函数,将Wide DataFrame转换为Tidy DataFrame
  3. 对Tidy DataFrame进行进一步处理
  4. 输出结果

下面针对这四个步骤进行详细说明,并且提供一个实例演示。

操作步骤详解

1. 导入Pandas库,读取Wide DataFrame

首先需要导入Pandas库,并且读取一个Wide DataFrame。这可以通过下面的代码片段实现:

import pandas as pd

# 读取Wide DataFrame
df_wide = pd.read_csv('wide_dataframe.csv')

2. 使用Melt函数,将Wide DataFrame转换为Tidy DataFrame

接下来需要使用Melt函数来将Wide DataFrame转换为Tidy DataFrame。Melt函数的一般形式为:

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

其中,frame是需要转换的Wide DataFrame;id_vars是标识符列的名称,它会被保留到Tidy DataFrame中;value_vars是需要被”融化”为一个列中的变量列,通常是Wide DataFrame中数据的列名;var_name可以指定用于保存Wide DataFrame中变量列名的列名,默认为”variable”;value_name可以指定用于保存Wide DataFrame中数据值的列名,默认为”value”。

例如,下面的代码片段将上一步中读取的Wide DataFrame转换为Tidy DataFrame:

# 将Wide DataFrame转换为Tidy DataFrame
df_tidy = pd.melt(df_wide, id_vars=['Country'], value_vars=['2017', '2018', '2019'], var_name='Year', value_name='GDP')

这里将Country列设置为标识符列(id_vars),将2017、2018、2019列设置为数据列(value_vars),将变量列的列名设置为”Year”,将数据值的列名设置为”GDP”。

3. 对Tidy DataFrame进行进一步处理

将Wide DataFrame转换为Tidy DataFrame后,可能还需要对其进行进一步的处理,比如排序、筛选等操作。这些操作与一般的Pandas DataFrame操作相同。

例如,可以对上一步中生成的Tidy DataFrame按照国家和年份进行排序:

# 对Tidy DataFrame按照国家和年份排序
df_tidy_sorted = df_tidy.sort_values(by=['Country', 'Year'])

# 输出结果
print(df_tidy_sorted)

4. 输出结果

最后,将结果输出即可。可以将Tidy DataFrame保存为CSV文件,也可以打印出来。

例如,可以将上一步中排序后的Tidy DataFrame保存为CSV文件:

# 将Tidy DataFrame保存为CSV文件
df_tidy_sorted.to_csv('tidy_dataframe.csv', index=False)

实例演示

下面提供一个简单的实例演示,用于演示如何使用Melt函数将Wide DataFrame转换为Tidy DataFrame。

假设有一个Wide DataFrame,它记录了四个国家在2017、2018、2019年的GDP数据,如下所示:

   Country      2017      2018      2019
0    China  12000000  14000000  16000000
1      USA  18000000  19000000  20000000
2  Germany   3000000   3200000   3400000
3    Japan   5000000   5100000   5200000

现在需要将其转换为Tidy DataFrame,并且按照国家和年份进行排序。

代码实现如下:

import pandas as pd

# 读取Wide DataFrame
df_wide = pd.read_csv('wide_dataframe.csv')

# 将Wide DataFrame转换为Tidy DataFrame
df_tidy = pd.melt(df_wide, id_vars=['Country'], value_vars=['2017', '2018', '2019'], var_name='Year', value_name='GDP')

# 对Tidy DataFrame进行进一步处理
df_tidy_sorted = df_tidy.sort_values(by=['Country', 'Year'])

# 将Tidy DataFrame保存为CSV文件
df_tidy_sorted.to_csv('tidy_dataframe.csv', index=False)

# 打印结果
print(df_tidy_sorted)

结果如下所示:

   Country  Year       GDP
2  Germany  2017   3000000
6  Germany  2018   3200000
10 Germany  2019   3400000
1      USA  2017  18000000
5      USA  2018  19000000
9      USA  2019  20000000
0    China  2017  12000000
4    China  2018  14000000
8    China  2019  16000000
3    Japan  2017   5000000
7    Japan  2018   5100000
11   Japan  2019   5200000

可见,Wide DataFrame已经被成功转换为了Tidy DataFrame,并且按照指定的排序方式进行了排序。