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

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

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

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

1.1 melt的基本语法

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

melt函数的基本语法如下:

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 将宽表转换为长表

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

import pandas as pd

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

原始数据如下:

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

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

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

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

转换后的数据如下:

   
### `melt` 函数 `melt` 函数用于将 DataFrame 从宽格式转换为长格式,可将指定的列转换为行,是一种常用的列转行操作方法。其语法如下: ```python pd.melt(frame: pandas.core.frame.DataFrame, id_vars=None, value_vars=None, var_name='variable', value_name='value', col_level=None) ``` - `frame`:要处理的 DataFrame。 - `id_vars`:指定不需要转换的列,这些列会作为标识符保留在结果中。 - `value_vars`:指定需要转换为行的列,如果未指定,则会将除 `id_vars` 之外的所有列进行转换。 - `var_name`:转换后新生成的列名,用于存储原来的列名,默认为 `'variable'`。 - `value_name`:转换后新生成的列名,用于存储原来列对应的值,默认为 `'value'`。 - `col_level`:如果列是多层索引,指定要处理的索引层级。 示例代码如下: ```python import pandas as pd df = pd.DataFrame({'姓名': ['A', 'B', 'C'], '学号': ['1001', '1002', '1003'], '英语': [90, 60, 70], '数学': [80, 98, 80], '语文': [85, 90, 75]}) melted_df = pd.melt(df, id_vars=['姓名', '学号'], var_name='科目', value_name='分数') print(melted_df) ``` 在这个示例中,`姓名` `学号` 列被指定为 `id_vars`,不会进行转换,`英语`、`数学` `语文` 列被转换为行,新生成的列名为 `科目` `分数` [^1]。 ### `pivot` 函数 `pivot` 函数用于将 DataFrame 从长格式转换为宽格式,与 `melt` 函数的操作相反。其语法如下: ```python DataFrame.pivot(index=None, columns=None, values=None) ``` - `index`:指定作为新 DataFrame 索引的列。 - `columns`:指定作为新 DataFrame 列名的列。 - `values`:指定填充新 DataFrame 值的列。 示例代码如下: ```python import pandas as pd df = pd.DataFrame({ 'name': ['A', 'A', 'A', 'B', 'B', 'B'], 'subject': ['Math', 'English', 'History', 'Math', 'English', 'History'], 'score': [84, 89, 70, 90, 84, 59] }) pivoted_df = df.pivot(index='name', columns='subject', values='score') print(pivoted_df) ``` 在这个示例中,`name` 列作为新 DataFrame 的索引,`subject` 列作为新 DataFrame 的列名,`score` 列的值填充到新 DataFrame 中 [^3]。 ### 与列转行操作的关系 `melt` 函数直接实现了列转行的操作,将宽格式的 DataFrame 转换为长格式。而 `pivot` 函数主要用于行转列,是 `melt` 函数的反向操作。当需要将某一列转行时,通常使用 `melt` 函数;如果需要将转换后的数据再恢复到原来的宽格式,可以使用 `pivot` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值