pandas基礎 變形

2021-10-05 14:08:07 字數 4699 閱讀 2261

import numpy as np

import pandas as pd

df = pd.read_csv(

'data/table.csv'

)df.head(

)

1、透視表

(1)pivot

一般狀態下,資料在dataframe會以壓縮狀態存放,例如gender列中f和m一起存放,兩個類別被疊在一列中,pivot函式可將某一列作為新的cols

df.pivot(index=

'id'

,columns=

'gender'

,values=

'height'

).head(

)

(2)pivot_table

pd.pivot_table(df,index=

'id'

,columns=

'gender'

,values=

'height'

).head(

)#由於功能更多,執行速度比較慢

%timeit df.pivot(index=

'id'

,columns=

'gender'

,values=

'height'

)%timeit pd.pivot_table(df,index=

'id'

,columns=

'gender'

,values=

'height'

)

pandas中提供了各種選項,下面介紹常用引數:

#aggfunc:對組內進行聚合統計,可傳入各類函式,預設為mean

pd.pivot_table(df,index=

'school'

,columns=

'gender'

,values=

'height'

,aggfunc=

['mean'

,'sum'])

.head()#

#margins:彙總邊際狀態

pd.pivot_table(df,index=

'school'

,columns=

'gender'

,values=

'height'

,aggfunc=

['mean'

,'sum'

],margins=

true

).head(

)#margins_name可以設定名字,預設為'all'

#行、列、值可以為多級

pd.pivot_table(df,index=

['school'

,'class'],

columns=

['gender'

,'address'],

values=

['height'

,'weight'

])

(3)crosstab(交叉表)

交叉表是一種特殊的透視表,典型的用途如分組統計,如現在想要統計關於街道和性別分組的頻數:

pd.crosstab(index=df[

'address'

],columns=df[

'gender'

])

交叉表的功能也很強大(但目前還不支援多級分組),下面說明一些重要引數:

pd.crosstab(index=df[

'address'

],columns=df[

'gender'],

values=np.random.randint(1,

20,df.shape[0]

),aggfunc=

'min'

)#預設引數等於如下方法:

#pd.crosstab(index=df['address'],columns=df['gender'],values=1,aggfunc='count')

除了邊際引數margins外,還引入了normalize引數,可選』all』,『index』,'columns』引數值

pd.crosstab(index=df[

'address'

],columns=df[

'gender'

],normalize=

'all'

,margins=

true

)

2、其他變形方法

(1)melt

melt函式可以認為是pivot函式的逆操作,將unstacked狀態的資料,壓縮成stacked,使「寬」的dataframe變「窄」

df_m = df[

['id'

,'gender'

,'math']]

df_m.head(

)df.pivot(index=

'id'

,columns=

'gender'

,values=

'math'

).head(

)

melt函式中的id_vars表示需要保留的列,value_vars表示需要stack的一組列

pivoted = df.pivot(index=

'id'

,columns=

'gender'

,values=

'math'

)result = pivoted.reset_index(

).melt(id_vars=

['id'

],value_vars=

['f'

,'m'

],value_name=

'math'

)\ .dropna(

).set_index(

'id'

).sort_index(

)#檢驗是否與展開前的df相同,可以分別將這些鏈式方法的中間步驟展開,看看是什麼結果

result.equals(df_m.set_index(

'id'

))

(2)壓縮與展開

stack:這是最基礎的變形函式,總共只有兩個引數:level和dropna

df_s = pd.pivot_table(df,index=

['class'

,'id'

],columns=

'gender'

,values=

['height'

,'weight'])

df_s.groupby(

'class'

).head(

2)

df_stacked = df_s.stack(

)df_stacked.groupby(

'class'

).head(

2)

stack函式可以看做將橫向的索引放到縱向,因此功能類似與melt,引數level可指定變化的列索引是哪一層(或哪幾層,需要列表)

df_stacked = df_s.stack(0)

df_stacked.groupby(

'class'

).head(

2)

unstack:stack的逆函式,功能上類似於pivot_table

df_stacked.head(

)result = df_stacked.unstack(

).swaplevel(1,

0,axis=1)

.sort_index(axis=1)

result.equals(df_s)

#同樣在unstack中可以指定level引數

3 啞變數與因子化

(1)dummy variable

這裡主要介紹get_dummies函式,其功能主要是進行one-hot編碼:

df_d = df[

['class'

,'gender'

,'weight']]

df_d.head(

)

現在希望將上面的**前兩列轉化為啞變數,並加入第三列weight數值:

pd.get_dummies(df_d[

['class'

,'gender']]

).join(df_d[

'weight'])

.head(

)#可選prefix引數新增字首,prefix_sep新增分隔符

(2)factorize方法

該方法主要用於自然數編碼,並且缺失值會被記做-1,其中sort引數表示是否排序後賦值

codes, uniques = pd.factorize(

['b'

,none

,'a'

,'c'

,'b'

], sort=

true

)display(codes)

display(uniques)

pandas學習之變形

首先,pandas變形工具有 pivot pivot table melt wide to long stack unstack crosstab explode get dummies。1 pivot與pivot table 這兩個函式,就相當於excel表的資料 兩者的區別是 pivot 不需要...

pandas學習第4章 變形

二 其他變形方法 三 啞變數與因子化 一般狀態下,資料在dataframe會以壓縮 stacked 狀態存放,例如下面的gender,兩個類別被疊在一列中,pivot函式可將某一列作為新的cols df.pivot index id columns gender values height head...

第四章 Pandas變形

pivot 透視表是一種可以對資料動態排布並且分類彙總的 格式 通過index,coloumn,value資訊,pivot函式可以對資料表進行重新重塑 其中行與列兩個引數是必須要有的 例如 我想以學號作為索引,檢視男女生的身高情況 df.pivot index id columns gender v...