這篇文章主要介紹了python利用panda實現(xiàn)列聯(lián)表的案例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
交叉表(cross-tabulation,簡稱crosstab)是?種?于計算分組頻率的特殊透視表。
語法詳解:
pd.crosstab(index, # 分組依據(jù) columns, # 列 values=None, # 聚合計算的值 rownames=None, # 列名稱 colnames=None, # 行名稱 aggfunc=None, # 聚合函數(shù) margins=False, # 總計行/列 dropna=True, # 是否刪除缺失值 normalize=False # )
import os import numpy as np import pandas as pd file_name = os.path.join(path, 'Excel_test.xls') df = pd.read_excel(io=file_name, # 工作簿路徑 sheetname='透視表', # 工作表名稱 skiprows=1, # 要忽略的行數(shù) parse_cols='A:D' # 讀入的列 ) df
pd.crosstab(df['客戶名稱'], df['產(chǎn)品類別'])
pd.crosstab(index=df['客戶名稱'], columns=df['產(chǎn)品類別'], values=df['銷量'], aggfunc='sum', margins=True ).round(0).fillna(0).astype('int')
注:因為交叉表示透視表的特例,所以交叉表可以用透視表的函數(shù)實現(xiàn)。又因為透視表可以用更 python 的方式 groupby-apply 實現(xiàn),所以,交叉表完全可以用 groupby-apply 的方式實現(xiàn)。
df.groupby(['客戶名稱', '產(chǎn)品類別']).apply(sum)
c_tbl = df.groupby(['客戶名稱', '產(chǎn)品類別']).apply(sum)['銷量'].unstack() c_tbl['總計'] = c_tbl.sum(axis=1) # 添加總計列 c_tbl.fillna(0).round(0).astype('int')
軟件信息:
補充:使用python(pandas)將數(shù)據(jù)處理成交叉分組表
交叉分組表是匯總兩種變量數(shù)據(jù)的方法, 在很多場景可以用到, 本文會介紹如何使用pandas將包含兩個變量的數(shù)據(jù)集處理成交叉分組表.
pandas
python 2.7
用坐標(biāo)軸來進(jìn)行比喻, 其中一個變量作為x軸, 另一個作為y軸, 如果定位到數(shù)據(jù)則累加一, 將所有數(shù)據(jù)遍歷一遍, 最后的坐標(biāo)軸就是一張交叉分組表(使用坐標(biāo)軸展示的數(shù)據(jù)一般是連續(xù)的, 交叉分組表的數(shù)據(jù)是離散的).
示例數(shù)據(jù):
quality price 0 bad 18 1 bad 17 2 great 52 3 good 28 4 excellent 88 5 great 63 6 bad 8 7 good 22 8 good 68 9 excellent 98 10 great 53 11 bad 13 12 great 62 13 good 48 14 excellent 78 15 great 63 16 good 37 17 great 69 18 good 28 19 excellent 81 20 great 43 21 good 32 22 great 62 23 good 28 24 excellent 82 25 great 53
代碼:
import pandas as pd from pandas import DataFrame, Series #生成數(shù)據(jù) df = DataFrame([['bad', 18], ['bad', 17], ['great', 52], ['good', 28], ['excellent', 88], ['great', 63] , ['bad', 8], ['good', 22], ['good', 68], ['excellent', 98], ['great', 53] , ['bad', 13], ['great', 62], ['good', 48], ['excellent', 78], ['great', 63] , ['good', 37], ['great', 69], ['good', 28], ['excellent', 81], ['great', 43] , ['good', 32], ['great', 62], ['good', 28], ['excellent', 82], ['great', 53]], columns = ['quality', 'price']) #廣播使用的函數(shù) def quality_cut(data): s = Series(pd.cut(data['price'], np.arange(0, 100, 10))) return pd.groupby(s, s).count() #進(jìn)行分組處理 df.groupby(df['quality']).apply(quality_cut)
結(jié)果:
交叉分組
從邏輯上來看, 為了達(dá)到對示例數(shù)據(jù)的交叉分組, 需要完成以下工作:
將數(shù)據(jù)以quality列進(jìn)行分組.
將每個分組的數(shù)據(jù)分別進(jìn)行cut, 以10為間隔.
將cut過的數(shù)據(jù), 以cut的范圍為列進(jìn)行分組
將所有數(shù)據(jù)組合到一起, row為quality, columns為cut的范圍
步驟1, pandasgroupby(...)接口, 會按照指定的列進(jìn)行分組處理, 每一個分組, 存儲相同類別的數(shù)據(jù)
<class 'pandas.core.frame.DataFrame'> quality price 0 bad 18 1 bad 17 6 bad 8 11 bad 13
而我們需要的, 只是price這列的數(shù)據(jù), 所以單獨將這列拿出來, 進(jìn)行cut, 最后得到我們要的series(步驟2, 步驟3)
price (0, 10] 1 (10, 20] 3 (20, 30] 0 (30, 40] 0 (40, 50] 0 (50, 60] 0 (60, 70] 0 (70, 80] 0 (80, 90] 0
使用pandas
apply()的廣播特性, 每一個分組的數(shù)據(jù)都會經(jīng)過上述幾個步驟的處理, 最后與第一次分組row進(jìn)行組合.
估計能力有限, 這個問題想了很長時間, 沒想到pandas這么可以這么方便達(dá)成交叉分組的效果. 思考的時候主要是卡在數(shù)據(jù)組合上, 當(dāng)數(shù)據(jù)量很大時通過多個步驟進(jìn)行數(shù)據(jù)組合, 肯定是低效而且錯誤的. 最后仔細(xì)研究了groupby, dataframe, series, dataframeIndex等數(shù)據(jù)模型, 使用廣播特性用幾句代碼就完成了. 證明了pandas的高性能, 也提醒自己遇見問題一定要耐心分析。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python利用panda實現(xiàn)列聯(lián)表的案例”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
新聞名稱:python利用panda實現(xiàn)列聯(lián)表的案例-創(chuàng)新互聯(lián)
分享地址:http://chinadenli.net/article24/peeje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、外貿(mào)網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)