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...