pandas學習第4章 變形

2021-10-05 13:22:29 字數 4822 閱讀 6133

二、其他變形方法

三、啞變數與因子化

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

df.pivot(index=

'id'

,columns=

'gender'

,values=

'height'

).head(

)

然而pivot函式具有很強的侷限性,除了功能上較少之外,還不允許values**現重複的行列索引對(pair),例如下面的語句就會報錯

因此,更多的時候會選擇使用強大的pivot_table函式

df.pivot(index=

'school'

,columns=

'gender'

,values=

'height'

).head(

)#valueerror: index contains duplicate entries, cannot reshape

於功由能更多,速度上比不上原來的pivot函式

pandas中提供了各種選項,其常用引數如下:

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

pd.pivot_table(df,index=

'school'

,columns=

'gender'

,\values=

'height'

,aggfunc=

['mean'

,'sum'])

.head(

)#傳入mean和sum函式,對f,m分別求平均,求和

(2)margins:彙總邊際狀態

pd.pivot_table(df,index=

'school'

,columns=

'gender'

,\values=

'height'

,aggfunc=

['mean'

,'sum'

],margins=

true

).head(

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

(3)行、列、值都可以為多級

pd.pivot_table(df,index=

['school'

,'class'],

#行兩級

columns=

['gender'

,'address'],

#列兩級

values=

['height'

,'weight'])

#值兩級

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

pd.crosstab(index=df[

'address'

],columns=df[

'gender'

])

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

(1) values和aggfunc:分組對某些資料進行聚合操作,

這兩個引數必須成對出現

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')

(2)normalize引數,可選』all』,『index』,'columns』引數值

pd.crosstab(index=df[

'address'],\

columns=df[

'gender'

],normalize=

'all'

,margins=

true

)

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'

))

(1)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_s.stack(level=-1, dropna=true)

df_stacked.groupby(

'class'

).head(2)

#stack函式可以看做將橫向的索引放到縱向,因此功能類似與melt,

#引數level可指定變化的列索引是哪一層(或哪幾層,需要列表)

df_stacked = df_s.stack(0)

df_stacked.groupby(

'class'

).head(

2)

(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引數

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新增分隔符

該方法主要用於自然數編碼,並且缺失值會被記做-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變形

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

學習筆記 第4章

standard 標準模式,呼叫startactivity殘生乙個例項 singletop 檢測是否已經存在乙個例項位於activitystack的頂部,如果存在就不產生新的勢力,否則呼叫newinstance產生新的勢力 singletask 在乙個新的task中產生這個勢力,以後每次呼叫都用此例...