數據 透視表 and 交叉表
先看數據是什么樣的 ...

# date dati = ['2019-11-01','2019-11-02','2019-11-03']*3 rng = pd.to_datetime(dati) df = DataFrame({ 'date':rng, 'key':list('abcdabcda'), 'value':np.random.randn(9)*10 }) df
簡單的透視表 方法 👉 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] })
簡單交叉表實現 :
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 字典