Python使用melt和pivot實(shí)現(xiàn)DataFrame格式轉(zhuǎn)換
引言
大家好,在數(shù)據(jù)處理與分析中,經(jīng)常遇到數(shù)據(jù)需要進(jìn)行格式轉(zhuǎn)換的情況,例如將數(shù)據(jù)從寬表格式轉(zhuǎn)換為長表格式,或?qū)?shù)據(jù)重新分組匯總。Pandas提供了豐富的reshape操作,尤其是melt和pivot這兩個(gè)函數(shù),使得DataFrame可以在寬表與長表之間高效轉(zhuǎn)換。通過合理使用melt和pivot,可以在數(shù)據(jù)清洗、特征工程等環(huán)節(jié)中極大地提升工作效率。
1. melt操作:寬表轉(zhuǎn)換為長表
1.1 melt的基本語法
在Pandas中,melt和pivot函數(shù)用于重塑DataFrame的結(jié)構(gòu),melt用于將寬表格式轉(zhuǎn)換為長表格式,通常用于將多列數(shù)據(jù)合并到一列中,pivot用于將長表格式轉(zhuǎn)換為寬表格式,通常用于將唯一值展開為多列。
melt函數(shù)的基本語法如下:
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value')
frame:要轉(zhuǎn)換的DataFrame。
id_vars:不需要被轉(zhuǎn)換的列,這些列將在轉(zhuǎn)換后的DataFrame中保持不變。
value_vars:需要被轉(zhuǎn)換的列,默認(rèn)會(huì)轉(zhuǎn)換除id_vars以外的所有列。
var_name:在轉(zhuǎn)換后的DataFrame中,新列的列名,表示變量名。
value_name:在轉(zhuǎn)換后的DataFrame中,新列的列名,表示變量值。
1.2 將寬表轉(zhuǎn)換為長表
以下是一個(gè)包含學(xué)生成績的寬表數(shù)據(jù),希望將其轉(zhuǎn)換為長表格式,以便分析各科成績。
import pandas as pd
# 創(chuàng)建示例數(shù)據(jù)
data = {
'姓名': ['Alice', 'Bob', 'Charlie'],
'數(shù)學(xué)': [85, 90, 95],
'英語': [78, 82, 88],
'物理': [92, 87, 94]
}
df = pd.DataFrame(data)
print("原始數(shù)據(jù):\n", df)原始數(shù)據(jù)如下:
姓名 數(shù)學(xué) 英語 物理 0 Alice 85 78 92 1 Bob 90 82 87 2 Charlie 95 88 94
1.3 使用melt將寬表轉(zhuǎn)換為長表
希望將每個(gè)學(xué)生的成績數(shù)據(jù)重塑為包含姓名、科目和分?jǐn)?shù)的長表格式??梢允褂?code>melt實(shí)現(xiàn):
# 使用 melt 將寬表轉(zhuǎn)換為長表
melted_df = pd.melt(df, id_vars=['姓名'], var_name='科目', value_name='分?jǐn)?shù)')
print("長表格式數(shù)據(jù):\n", melted_df)轉(zhuǎn)換后的數(shù)據(jù)如下:
姓名 科目 分?jǐn)?shù) 0 Alice 數(shù)學(xué) 85 1 Bob 數(shù)學(xué) 90 2 Charlie 數(shù)學(xué) 95 3 Alice 英語 78 4 Bob 英語 82 5 Charlie 英語 88 6 Alice 物理 92 7 Bob 物理 87 8 Charlie 物理 94
通過melt操作,將每個(gè)學(xué)生的成績展開為按姓名和科目分組的長表格式,使得分析更加靈活。
1.4 melt高級(jí)應(yīng)用:篩選特定列
在某些情況下,只想轉(zhuǎn)換特定的列,而不需要轉(zhuǎn)換所有列。
可以通過value_vars參數(shù)指定需要轉(zhuǎn)換的列,例如只轉(zhuǎn)換數(shù)學(xué)和英語成績:
melted_df_filtered = pd.melt(df, id_vars=['姓名'], value_vars=['數(shù)學(xué)', '英語'], var_name='科目', value_name='分?jǐn)?shù)')
print("篩選后的長表格式數(shù)據(jù):\n", melted_df_filtered)結(jié)果如下:
姓名 科目 分?jǐn)?shù) 0 Alice 數(shù)學(xué) 85 1 Bob 數(shù)學(xué) 90 2 Charlie 數(shù)學(xué) 95 3 Alice 英語 78 4 Bob 英語 82 5 Charlie 英語 88
通過指定value_vars參數(shù),將寬表部分轉(zhuǎn)換為長表,保留了物理成績列未被轉(zhuǎn)換。
2. pivot操作:長表轉(zhuǎn)換為寬表
2.1 pivot的基本語法
pivot函數(shù)的基本語法如下:
pd.pivot(data, index, columns, values)
data:要轉(zhuǎn)換的DataFrame。
index:用于透視表的行索引。
columns:用于透視表的列索引。
values:需要在透視表中顯示的數(shù)據(jù)。
2.2 將長表轉(zhuǎn)換為寬表
假設(shè)已經(jīng)將學(xué)生成績的數(shù)據(jù)轉(zhuǎn)換為長表格式,現(xiàn)在希望將其還原為寬表:
# 使用 pivot 將長表轉(zhuǎn)換為寬表
pivot_df = melted_df.pivot(index='姓名', columns='科目', values='分?jǐn)?shù)')
print("還原后的寬表格式數(shù)據(jù):\n", pivot_df)結(jié)果如下:
科目 數(shù)學(xué) 英語 物理 姓名 Alice 85 78 92 Bob 90 82 87 Charlie 95 88 94
通過pivot操作,將每個(gè)學(xué)生的各科成績還原為原始寬表格式。
2.3 pivot的高級(jí)應(yīng)用:多級(jí)索引
在復(fù)雜的數(shù)據(jù)場(chǎng)景中,可能需要在行或列上使用多級(jí)索引。例如,如果數(shù)據(jù)中包含時(shí)間信息,可以創(chuàng)建多級(jí)索引以展示不同時(shí)間的成績變化。
假設(shè)數(shù)據(jù)包含學(xué)生、科目和學(xué)期信息,我們可以通過pivot實(shí)現(xiàn)多級(jí)索引的透視表:
# 創(chuàng)建包含學(xué)期信息的數(shù)據(jù)
data = {
'姓名': ['Alice', 'Alice', 'Bob', 'Bob'],
'科目': ['數(shù)學(xué)', '英語', '數(shù)學(xué)', '英語'],
'學(xué)期': ['第一學(xué)期', '第二學(xué)期', '第一學(xué)期', '第二學(xué)期'],
'分?jǐn)?shù)': [85, 88, 90, 85]
}
df_multi = pd.DataFrame(data)
# 使用 pivot 創(chuàng)建多級(jí)索引的寬表
pivot_multi = df_multi.pivot(index='姓名', columns=['科目', '學(xué)期'], values='分?jǐn)?shù)')
print("多級(jí)索引的寬表格式數(shù)據(jù):\n", pivot_multi)結(jié)果如下:
科目 數(shù)學(xué) 英語 學(xué)期 第一學(xué)期 第二學(xué)期 第一學(xué)期 第二學(xué)期 姓名 Alice 85 88 NaN 88 Bob 90 NaN 85 85
通過多級(jí)索引,可以在行列上展示更多的維度信息,使數(shù)據(jù)結(jié)構(gòu)更直觀。
3. pivot_table:支持聚合的長表到寬表轉(zhuǎn)換
pivot只支持唯一值轉(zhuǎn)換,但如果需要在轉(zhuǎn)換過程中進(jìn)行聚合,可以使用pivot_table函數(shù)。pivot_table允許對(duì)值進(jìn)行聚合操作,例如求和、均值等。
假設(shè)數(shù)據(jù)中包含多行同一學(xué)生的成績,可以使用pivot_table進(jìn)行聚合:
data = {
'姓名': ['Alice', 'Alice', 'Bob', 'Bob', 'Charlie', 'Charlie'],
'科目': ['數(shù)學(xué)', '數(shù)學(xué)', '英語', '英語', '物理', '物理'],
'分?jǐn)?shù)': [85, 90, 82, 88, 94, 96]
}
df_agg = pd.DataFrame(data)
# 使用 pivot_table 進(jìn)行均值聚合
pivot_agg = pd.pivot_table(df_agg, index='姓名', columns='科目', values='分?jǐn)?shù)', aggfunc='mean')
print("聚合后的寬表格式數(shù)據(jù):\n", pivot_agg)結(jié)果如下:
科目 數(shù)學(xué) 英語 物理 姓名 Alice 87.5 NaN NaN Bob NaN 85.0 NaN Charlie NaN NaN 95.0
分的聚合計(jì)算,并生成了一個(gè)按學(xué)生和科目分組的寬表格式。pivot_table提供了靈活的聚合功能,使得數(shù)據(jù)轉(zhuǎn)換和統(tǒng)計(jì)計(jì)算可以同步進(jìn)行,非常適合多維度、多層級(jí)的數(shù)據(jù)分析。
4. melt與pivot的組合使用
在實(shí)際的數(shù)據(jù)處理過程中,melt與pivot常常結(jié)合使用,可以在寬表與長表之間來回轉(zhuǎn)換。例如,數(shù)據(jù)可能在某個(gè)環(huán)節(jié)需要以長表格式進(jìn)行某些計(jì)算處理,然后再轉(zhuǎn)換回寬表格式進(jìn)行展示。
假設(shè)有一個(gè)原始的寬表格式數(shù)據(jù),表示每個(gè)學(xué)生每月的消費(fèi)記錄。想要通過melt將數(shù)據(jù)轉(zhuǎn)換為長表格式以便計(jì)算每個(gè)學(xué)生的消費(fèi)總額,再通過pivot將結(jié)果還原為寬表格式。
# 創(chuàng)建示例數(shù)據(jù)
data = {
'姓名': ['Alice', 'Bob', 'Charlie'],
'1月': [200, 150, 300],
'2月': [180, 200, 250],
'3月': [220, 170, 280]
}
df_expense = pd.DataFrame(data)
print("原始數(shù)據(jù):\n", df_expense)原始數(shù)據(jù)如下:
姓名 1月 2月 3月 0 Alice 200 180 220 1 Bob 150 200 170 2 Charlie 300 250 280
使用melt將數(shù)據(jù)轉(zhuǎn)換為長表格式:
# 使用 melt 將寬表轉(zhuǎn)換為長表
melted_expense = pd.melt(df_expense, id_vars=['姓名'], var_name='月份', value_name='消費(fèi)額')
print("長表格式數(shù)據(jù):\n", melted_expense)轉(zhuǎn)換后的長表數(shù)據(jù):
姓名 月份 消費(fèi)額 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
假設(shè)已經(jīng)對(duì)長表數(shù)據(jù)進(jìn)行了處理或分析,現(xiàn)在需要將其還原為寬表格式。
# 使用 pivot 將長表轉(zhuǎn)換為寬表
pivot_expense = melted_expense.pivot(index='姓名', columns='月份', values='消費(fèi)額')
print("還原后的寬表格式數(shù)據(jù):\n", pivot_expense)還原后的寬表數(shù)據(jù):
月份 1月 2月 3月 姓名 Alice 200 180 220 Bob 150 200 170 Charlie 300 250 280
通過這種方式,可以在需要時(shí)靈活地在寬表和長表之間轉(zhuǎn)換,使數(shù)據(jù)清洗和分析過程更加高效和清晰。
melt和pivot是Pandas中強(qiáng)大的reshape工具,能夠有效在寬表和長表之間進(jìn)行轉(zhuǎn)換。通過melt可以將數(shù)據(jù)轉(zhuǎn)換為更易分析的長表格式,而pivot可以將長表轉(zhuǎn)換為更具可讀性的寬表格式。無論是處理多維度數(shù)據(jù),還是生成多層次的匯總表,melt和pivot都能大大提升數(shù)據(jù)分析的靈活性和效率。
以上就是Python使用melt和pivot實(shí)現(xiàn)DataFrame格式轉(zhuǎn)換的詳細(xì)內(nèi)容,更多關(guān)于Python DataFrame格式轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)合并兩個(gè)字典的8種方法
Python有多種方法可以通過使用各種函數(shù)和構(gòu)造函數(shù)來合并字典,本文主要介紹了Python實(shí)現(xiàn)合并兩個(gè)字典的8種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Python人工智能之混合高斯模型運(yùn)動(dòng)目標(biāo)檢測(cè)詳解分析
運(yùn)動(dòng)目標(biāo)檢測(cè)是計(jì)算機(jī)視覺領(lǐng)域中的一個(gè)重要內(nèi)容,其檢測(cè)效果將會(huì)對(duì)目標(biāo)跟蹤與識(shí)別造成一定的影響,本文將介紹用Python來進(jìn)行混合高斯模型運(yùn)動(dòng)目標(biāo)檢測(cè),感興趣的朋友快來看看吧2021-11-11
徹底弄懂Python中的回調(diào)函數(shù)(callback)
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python中回調(diào)函數(shù)(callback)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Python使用Dash開發(fā)網(wǎng)頁應(yīng)用的方法詳解
本文主要是通過Dash的Checklist組件,簡(jiǎn)單介紹使用Dash開發(fā)的Web應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
Python使用XPath進(jìn)行正則表達(dá)式匹配的實(shí)戰(zhàn)指南
在Web自動(dòng)化測(cè)試和數(shù)據(jù)抓取中,我們經(jīng)常遇到動(dòng)態(tài)生成的HTML屬性,傳統(tǒng)XPath定位方式容易因這些變化而失效,下面我們就來看看Python中如何運(yùn)用XPath正則匹配吧2026-04-04

