Python中的melt和pivot轻松实现DataFrame格式转换

大家好,在数据处理与分析中,经常遇到数据需要进行格式转换的情况,例如将数据从宽表格式转换为长表格式,或将数据重新分组汇总。Pandas提供了丰富的reshape操作,尤其是meltpivot这两个函数,使得DataFrame可以在宽表与长表之间高效转换。通过合理使用meltpivot,可以在数据清洗、特征工程等环节中极大地提升工作效率。

1. melt操作:宽表转换为长表

1.1 melt的基本语法

在Pandas中,meltpivot函数用于重塑DataFrame的结构,melt用于将宽表格式转换为长表格式,通常用于将多列数据合并到一列中,pivot用于将长表格式转换为宽表格式,通常用于将唯一值展开为多列。

melt函数的基本语法如下:

python 复制代码
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value')

frame:要转换的DataFrame。

id_vars:不需要被转换的列,这些列将在转换后的DataFrame中保持不变。

value_vars:需要被转换的列,默认会转换除id_vars以外的所有列。

var_name:在转换后的DataFrame中,新列的列名,表示变量名。

value_name:在转换后的DataFrame中,新列的列名,表示变量值。

1.2 将宽表转换为长表

以下是一个包含学生成绩的宽表数据,希望将其转换为长表格式,以便分析各科成绩。

python 复制代码
import pandas as pd

# 创建示例数据
data = {
    '姓名': ['Alice', 'Bob', 'Charlie'],
    '数学': [85, 90, 95],
    '英语': [78, 82, 88],
    '物理': [92, 87, 94]
}
df = pd.DataFrame(data)
print("原始数据:\n", df)

原始数据如下:

python 复制代码
       姓名  数学  英语  物理
0    Alice  85  78  92
1      Bob  90  82  87
2  Charlie  95  88  94

1.3 使用melt将宽表转换为长表

希望将每个学生的成绩数据重塑为包含姓名科目分数的长表格式。可以使用melt实现:

python 复制代码
# 使用 melt 将宽表转换为长表
melted_df = pd.melt(df, id_vars=['姓名'], var_name='科目', value_name='分数')
print("长表格式数据:\n", melted_df)

转换后的数据如下:

python 复制代码
       姓名   科目  分数
0    Alice   数学  85
1      Bob   数学  90
2  Charlie   数学  95
3    Alice   英语  78
4      Bob   英语  82
5  Charlie   英语  88
6    Alice   物理  92
7      Bob   物理  87
8  Charlie   物理  94

通过melt操作,将每个学生的成绩展开为按姓名科目分组的长表格式,使得分析更加灵活。

1.4 melt高级应用:筛选特定列

在某些情况下,只想转换特定的列,而不需要转换所有列。

可以通过value_vars参数指定需要转换的列,例如只转换数学和英语成绩:

python 复制代码
melted_df_filtered = pd.melt(df, id_vars=['姓名'], value_vars=['数学', '英语'], var_name='科目', value_name='分数')
print("筛选后的长表格式数据:\n", melted_df_filtered)

结果如下:

python 复制代码
       姓名   科目  分数
0    Alice   数学  85
1      Bob   数学  90
2  Charlie   数学  95
3    Alice   英语  78
4      Bob   英语  82
5  Charlie   英语  88

通过指定value_vars参数,将宽表部分转换为长表,保留了物理成绩列未被转换。

2. pivot操作:长表转换为宽表

2.1 pivot的基本语法

pivot函数的基本语法如下:

python 复制代码
pd.pivot(data, index, columns, values)

data:要转换的DataFrame。

index:用于透视表的行索引。

columns:用于透视表的列索引。

values:需要在透视表中显示的数据。

2.2 将长表转换为宽表

假设已经将学生成绩的数据转换为长表格式,现在希望将其还原为宽表:

python 复制代码
# 使用 pivot 将长表转换为宽表
pivot_df = melted_df.pivot(index='姓名', columns='科目', values='分数')
print("还原后的宽表格式数据:\n", pivot_df)

结果如下:

python 复制代码
科目      数学   英语   物理
姓名                  
Alice  85  78  92
Bob    90  82  87
Charlie  95  88  94

通过pivot操作,将每个学生的各科成绩还原为原始宽表格式。

2.3 pivot的高级应用:多级索引

在复杂的数据场景中,可能需要在行或列上使用多级索引。例如,如果数据中包含时间信息,可以创建多级索引以展示不同时间的成绩变化。

假设数据包含学生、科目和学期信息,我们可以通过pivot实现多级索引的透视表:

python 复制代码
# 创建包含学期信息的数据
data = {
    '姓名': ['Alice', 'Alice', 'Bob', 'Bob'],
    '科目': ['数学', '英语', '数学', '英语'],
    '学期': ['第一学期', '第二学期', '第一学期', '第二学期'],
    '分数': [85, 88, 90, 85]
}
df_multi = pd.DataFrame(data)

# 使用 pivot 创建多级索引的宽表
pivot_multi = df_multi.pivot(index='姓名', columns=['科目', '学期'], values='分数')
print("多级索引的宽表格式数据:\n", pivot_multi)

结果如下:

python 复制代码
科目     数学          英语       
学期     第一学期    第二学期     第一学期   第二学期
姓名                                        
Alice     85         88        NaN       88
Bob       90        NaN        85       85

通过多级索引,可以在行列上展示更多的维度信息,使数据结构更直观。

3. pivot_table:支持聚合的长表到宽表转换

pivot只支持唯一值转换,但如果需要在转换过程中进行聚合,可以使用pivot_table函数。pivot_table允许对值进行聚合操作,例如求和、均值等。

假设数据中包含多行同一学生的成绩,可以使用pivot_table进行聚合:

python 复制代码
data = {
    '姓名': ['Alice', 'Alice', 'Bob', 'Bob', 'Charlie', 'Charlie'],
    '科目': ['数学', '数学', '英语', '英语', '物理', '物理'],
    '分数': [85, 90, 82, 88, 94, 96]
}
df_agg = pd.DataFrame(data)

# 使用 pivot_table 进行均值聚合
pivot_agg = pd.pivot_table(df_agg, index='姓名', columns='科目', values='分数', aggfunc='mean')
print("聚合后的宽表格式数据:\n", pivot_agg)

结果如下:

复制代码
科目       数学      英语    物理
姓名                    
Alice  87.5     NaN   NaN
Bob     NaN    85.0   NaN
Charlie NaN    NaN   95.0

分的聚合计算,并生成了一个按学生和科目分组的宽表格式。pivot_table提供了灵活的聚合功能,使得数据转换和统计计算可以同步进行,非常适合多维度、多层级的数据分析。

4. melt与pivot的组合使用

在实际的数据处理过程中,meltpivot常常结合使用,可以在宽表与长表之间来回转换。例如,数据可能在某个环节需要以长表格式进行某些计算处理,然后再转换回宽表格式进行展示。

假设有一个原始的宽表格式数据,表示每个学生每月的消费记录。想要通过melt将数据转换为长表格式以便计算每个学生的消费总额,再通过pivot将结果还原为宽表格式。

python 复制代码
# 创建示例数据
data = {
    '姓名': ['Alice', 'Bob', 'Charlie'],
    '1月': [200, 150, 300],
    '2月': [180, 200, 250],
    '3月': [220, 170, 280]
}
df_expense = pd.DataFrame(data)
print("原始数据:\n", df_expense)

原始数据如下:

python 复制代码
       姓名   1月   2月   3月
0    Alice  200  180  220
1      Bob  150  200  170
2  Charlie  300  250  280

使用melt将数据转换为长表格式:

python 复制代码
# 使用 melt 将宽表转换为长表
melted_expense = pd.melt(df_expense, id_vars=['姓名'], var_name='月份', value_name='消费额')
print("长表格式数据:\n", melted_expense)

转换后的长表数据:

python 复制代码
       姓名  月份  消费额
0    Alice   1月  200
1      Bob   1月  150
2  Charlie   1月  300
3    Alice   2月  180
4      Bob   2月  200
5  Charlie   2月  250
6    Alice   3月  220
7      Bob   3月  170
8  Charlie   3月  280

假设已经对长表数据进行了处理或分析,现在需要将其还原为宽表格式。

python 复制代码
# 使用 pivot 将长表转换为宽表
pivot_expense = melted_expense.pivot(index='姓名', columns='月份', values='消费额')
print("还原后的宽表格式数据:\n", pivot_expense)

还原后的宽表数据:

python 复制代码
月份       1月   2月   3月
姓名                   
Alice   200  180  220
Bob     150  200  170
Charlie 300  250  280

通过这种方式,可以在需要时灵活地在宽表和长表之间转换,使数据清洗和分析过程更加高效和清晰。

meltpivot是Pandas中强大的reshape工具,能够有效在宽表和长表之间进行转换。通过melt可以将数据转换为更易分析的长表格式,而pivot可以将长表转换为更具可读性的宽表格式。无论是处理多维度数据,还是生成多层次的汇总表,meltpivot都能大大提升数据分析的灵活性和效率。

相关推荐
魔尔助理顾问35 分钟前
Flask如何读取配置信息
python·flask·bootstrap
chxii1 小时前
5java集合框架
java·开发语言
老衲有点帅1 小时前
C#多线程Thread
开发语言·c#
C++ 老炮儿的技术栈1 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
jc_hook2 小时前
Python 接入DeepSeek
python·大模型·deepseek
IsPrisoner2 小时前
Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)
开发语言·后端·golang
Python私教2 小时前
征服Rust:从零到独立开发的实战进阶
服务器·开发语言·rust
chicpopoo2 小时前
Python打卡DAY25
开发语言·python
crazyme_63 小时前
深入掌握 Python 切片操作:解锁数据处理的高效密码
开发语言·python