一、列轉行
1、背景描述
在日常處理數據過程中,你們可能會經常遇到這種類型的數據:
而我們用pandas進行統計分析時,往往需要將結果轉換成以下類型的數據:
2.方法描述
準備數據
df = pd.DataFrame({'姓名': ['A','B','C'], '英語':[90,60,70], '數學':[80,98,80], '語文':[85,90,75]})
這個實現的方法有多種形式,這里集中進行展示
2.1 方法1
tmp=df.set_index(['姓名']).stack() tmp2=tmp.rename_axis(index=['姓名','科目']) tmp2.name='分數' tmp2.reset_index()
2.2 方法2
tmp=df.set_index(['姓名']).stack() tmp.index.names=['姓名','科目'] tmp.reset_index(name='分數')
2.3 方法3
tmp=df.set_index(['姓名']).stack().reset_index() tmp.columns=['姓名','科目','分數']
2.4 方法4
tmp=pd.melt(df,id_vars='姓名',var_name='科目',value_name='分數')
3 思考與總結
通過上述的對比,相信各位已經明白其中的厲害之處了,下面就來重點講解一下melt這個函數。melt函數共有以下幾個:
frame: 需要處理的數據幀id_vars: 不需要做列轉行處理的字段,如果不設置該字段則默認會對所有列進行處理value_vars: 需要做列轉行的字段,不指定則不處理var_name: 列轉行處理后,生成字段列,對列轉行之前的字段名稱進行重命名value_name: 列轉行處理后,生成數值列,對列轉行之前的數值進行命名col_level: 指定具體的列名等級,通常在有多級列名時使用。
4 思維延伸
4.1 例子1
轉換前:
轉換后:
實現的1種方法:
#準備數據 df2 = pd.DataFrame({'姓名': ['A', 'B', 'C'], '班級':[1,2,1], '期中考試-英語': [90, 60, 70], '期中考試-數學': [80, 98, 80], '期中考試-語文': [85, 90, 75], '期末考試-英語': [92, 63, 76], '期末考試-數學': [85,100, 89], '期末考試-語文': [87, 91, 80]}) #實現部分 t1=pd.melt(df2, id_vars=['姓名','班級'], var_name='科目', value_name='分數') t2=t1.set_index(['姓名','班級','分數'])['科目'].str.split('-',expand=True).reset_index() t2.set_index(['姓名','班級',0,1]).unstack().reset_index().rename_axis() t3=t2.set_index(['姓名','班級',0,1]).unstack() t3.columns=t3.columns.droplevel(0) result=t3.rename_axis(columns=None).reset_index().rename(columns={0:'考試類型'}) result
4.2 例子2
轉換前:
轉換后:
實現方法舉例:
pd.lreshape(df2,{'英語':['期中考試-英語','期末考試-英語'], '數學':['期中考試-數學','期末考試-數學'], '語文':['期中考試-語文','期末考試-語文']})
二、行轉列
在一中,我們已經完成了對于列轉行的任務,即將本文一中的多列df轉為tmp,那現在假如需要進行列轉行又該如何操作呢?
1.準備數據
tmp=pd.DataFrame({'姓名':['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'], '科目':['英語', '英語', '英語', '數學', '數學', '數學', '語文', '語文', '語文'], '分數':[90, 60, 70, 80, 98, 80, 85, 90, 75]}) tmp
2.行轉列實現
2.1 方法1
tmp2=tmp.set_index(['姓名','科目'])['分數'].unstack() df=tmp2.rename_axis(columns=None).reset_index()
2.2 方法2
tmp2=tmp.set_index(['姓名','科目'])['分數'].unstack() df=tmp2.rename_axis(columns=None).reset_index()
2.3 方法3
df=tmp.pivot(index='姓名',columns='科目',values='分數').rename_axis(columns=None).reset_index()
3.思考與總結
從行轉列的例子中,我們可以發現核心的函數是unstack。unstack是將多重索引形式的數據,轉換為標準表格形式的數據,unstack主要由兩個參數組成:
level :要取消堆疊的索引級別,可以傳遞級別名稱 。默認參數為-1,例子中為科目,即最后一個索引fill_value :如果取消堆疊后有缺失數據,會以固定字符進行填充。
三、行列轉換(長寬互換)
(1) stack和unstack
California 2000 33871648 2010 37253956 New York 2000 18976457 2010 19378102 Texas 2000 20851820 2010 25145561
以上述數據為例
new_df = pop.unstack() new_df
unstack() 方法可以快速將一個多級索引的 Series 轉化為普通索引的 DataFrame,stack則可以實現將列轉化為索引。
來看個實際的行列互換的例子
列轉行
import pandas as pd df = pd.read_csv('data/pew.csv') df.head(10)
df = df.set_index('religion') #先把religion設為索引 df = df.stack() #將列轉化為二級索引 df.index = df.index.rename('income', level=1) #二級索引命命 df.name = 'frequency' df = df.reset_index() #將索引轉化為Series df.head(10)
上述轉化,可以看作是寬表轉長表,很好記憶,將一組具有相同特征的列,轉化成一列,自然就變窄了,同時為了一一對應,需要和其他列做組合,就會變長。
總結
到此這篇關于pandas如何優雅的列轉行及行轉列的文章就介紹到這了,更多相關pandas列轉行及行轉列內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/qq_41780234/article/details/121622495