Python--數據透視表和交叉表、數據讀取


數據 透視表 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
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 字典

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM