資料 透視表 and 交叉表
先看資料是什麼樣的 ...

#date
dati = ['2019-11-01','2019-11-02','2019-11-03']*3rng=pd.to_datetime(dati)
df=DataFrame({'date':rng,'key':list('abcdabcda'),'value':np.random.randn(9)*10})
df
View Code
簡單的透視表 方法👉 pivot_table()
文法是這樣的 :
pd.pivot_table(
data,
values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All',
observed=False,
)#data : DataFrame 對象#values : 要聚合的列 或者 清單#index : 資料透視表的index , 行索引 ,從原始資料的列中進行篩選#columns : 資料透視表的columns 列名 ,從原始資料中篩選#aggfunc : 用于聚合的函數 , 預設是 np.mean , 支援numpy 的計算方法
是以按照文法 ,應該這樣操作 ,不需要每個都填上, 根據我們需要的 ,填上對應的資料及參數就可以了.
pd.pivot_table(df , values='value',index='date',columns='key',aggfunc=np.mean)
# 👆 這個就是從date中根據 值 對應的key中的值,以一對一,一對多的方式尋找 ,如果沒有找到 就用NaN 填充 ,
# 👆 data 中的 2019 -11 - 01 在key 中有a , c ,d ,有就對應填充 , 而 b沒有就用NaN填充。2019 -11 -02 , 2019 - 11 -03 依次類推。
pd.pivot_table(df,values='value',index=['date','key'],aggfunc=np.sum)#以date ,key 共同做行進行索引,值為value,統計不同(date, key)情況下的計算
# 👆 , 這也就是用層次索引的計算嘛 , 一看圖就懂了。簡單的資料透視表.想深入了解,請自行百度。
交叉表的實作 方法 👉 crosstab()
在預設情況下 , crosstab() 計算因子的頻率表 , 比如用于 str 的資料透視分析
文法是這樣的 :
pd.crosstab(index,
columns,
values=None,
rownames=None,
colnames=None,
aggfunc=None,
margins=False,
margins_name='All',
dropna=True,
normalize=False,
)
示範資料:

nf =DataFrame({'A':[1,2,2,2,2],'B':[3,3,4,4,4],'C':[1,1,np.nan,1,1]
})
View Code
簡單交叉表實作 :
pd.crosstab(nf['A'],nf['B'])#如果crosstab 隻接收兩個Series 它将提供一個頻率表#上面代碼是用 A 的唯一值,統計 B 的唯一的出現次數
# 👆 注解 :A=1 and B =3 出現過1次 , A=2and B =3 出現過1次, B= 4 and A=1 出現過0次 ,B =4 and A =2 出現過3次,是以豎這看就是 1 1 0 3。OK!
設定 normalize 參數為 True 時,會顯示百分百,總的百分百 :
pd.crosstab(nf['A'],nf['B'],normalize=True)
# 👇 下方為 交叉表C列計算 ,,,,
pd.crosstab(nf['A'],nf['B'],values=nf['C'],aggfunc=sum)#values : 可選 , 根據因子聚合的值得列或者說是數組#aggfunc : 可選 ,如果未傳遞values資料,則計算頻率,如果傳遞了數組,則按照指定計算#相同于按照A和B界定分組,計算每一組中第三個列C的值
# 👆 這個就是 A和B交叉表的C列的值 計算 ,A和B交叉出現幾次 就把A和B交叉的對于C列計算。看圖秒懂
margins 參數 :布爾值 ,預設是False ,用于添加 行 or 列 的小計,就是求和
pd.crosstab(nf['A'],nf['B'],values=nf['C'],margins=True,margins_name='小計',aggfunc=sum)#margins_name 就是重命名嘛 , 一看就懂了, , , NaN值都是自動忽略的
資料的讀取 txt / csv / excel ...... 方法👉 read_*()
*就是 按Tab 鍵位 會出現read_ 清單 ,選取自己所需要的
read_table()主要用來讀取簡單的資料 , txt or csv
檔案打開是這樣的 :
👇 檔案資料的讀取 :
dinner = pd.read_table('diner.csv',delimiter=',',header=0,index_col=0 ,encoding='gbk')
dinner.head()#預設取前5條資料
# delimiter : 用于拆分的字元 ,也可以使用sep=','
# header : 用作列名的序号 ,預設為 0 也就是第一行 .如果沒有,header=None
# index_col : 指定某列為行索引 ,否則自動索引(0,1,2....)
專門用來讀取 csv 資料 👉 read_csv() :
作用和上面的一樣,不過上面的寫法更為标準
d_csv = pd.read_csv('diner.csv',engine='python')
d_csv.head()
還有讀取excel 資料 👉 read_excel()
d_excel = pd.read_excel('demo.xlsx',sheet_name='demo',header=0)
d_excel.head()#sheet_name : 取 excel檔案中的一張表 ,傳回多張使用sheet_name=[0,1],sheet_name=None 傳回全表#1. int / string 傳回的是dataframe#2. none / list 傳回的是dict 字典