国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

python 利用panda 實現列聯表(交叉表)

瀏覽:93日期:2022-06-28 10:38:54

交叉表(cross-tabulation,簡稱crosstab)是⼀種⽤于計算分組頻率的特殊透視表。

語法詳解:

pd.crosstab(index, # 分組依據 columns, # 列 values=None, # 聚合計算的值 rownames=None, # 列名稱 colnames=None, # 行名稱 aggfunc=None, # 聚合函數 margins=False, # 總計行/列 dropna=True, # 是否刪除缺失值 normalize=False # )1 crosstab() 實例11.1 讀取數據

import osimport numpy as npimport pandas as pdfile_name = os.path.join(path, ’Excel_test.xls’)df = pd.read_excel(io=file_name, # 工作簿路徑 sheetname=’透視表’, # 工作表名稱 skiprows=1, # 要忽略的行數 parse_cols=’A:D’ # 讀入的列 )df

python 利用panda 實現列聯表(交叉表)

1.2 pd.crosstab() 默認生成以行和列分類的頻數表

pd.crosstab(df[’客戶名稱’], df[’產品類別’])

python 利用panda 實現列聯表(交叉表)

1.3 設置跟多參數實現分類匯總

pd.crosstab(index=df[’客戶名稱’], columns=df[’產品類別’], values=df[’銷量’], aggfunc=’sum’, margins=True ).round(0).fillna(0).astype(’int’)

python 利用panda 實現列聯表(交叉表)

注:因為交叉表示透視表的特例,所以交叉表可以用透視表的函數實現。又因為透視表可以用更 python 的方式 groupby-apply 實現,所以,交叉表完全可以用 groupby-apply 的方式實現。

2 用分類匯總的方法實現 交叉表

df.groupby([’客戶名稱’, ’產品類別’]).apply(sum)

python 利用panda 實現列聯表(交叉表)

2.1 分類匯總、重新索引、設置數值格式綜合應用

c_tbl = df.groupby([’客戶名稱’, ’產品類別’]).apply(sum)[’銷量’].unstack()c_tbl[’總計’] = c_tbl.sum(axis=1) # 添加總計列c_tbl.fillna(0).round(0).astype(’int’)

python 利用panda 實現列聯表(交叉表)

軟件信息:

python 利用panda 實現列聯表(交叉表)

補充:使用python(pandas)將數據處理成交叉分組表

交叉分組表是匯總兩種變量數據的方法, 在很多場景可以用到, 本文會介紹如何使用pandas將包含兩個變量的數據集處理成交叉分組表.

環境

pandas

python 2.7

原理

用坐標軸來進行比喻, 其中一個變量作為x軸, 另一個作為y軸, 如果定位到數據則累加一, 將所有數據遍歷一遍, 最后的坐標軸就是一張交叉分組表(使用坐標軸展示的數據一般是連續的, 交叉分組表的數據是離散的).

具體實現

示例數據:

quality price0 bad 181 bad 172 great 523 good 284 excellent 885 great 636 bad 87 good 228 good 689 excellent 9810 great 5311 bad 1312 great 6213 good 4814 excellent 7815 great 6316 good 3717 great 6918 good 2819 excellent 8120 great 4321 good 3222 great 6223 good 2824 excellent 8225 great 53

代碼:

import pandas as pd from pandas import DataFrame, Series #生成數據 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’])#廣播使用的函數def quality_cut(data): s = Series(pd.cut(data[’price’], np.arange(0, 100, 10))) return pd.groupby(s, s).count()#進行分組處理df.groupby(df[’quality’]).apply(quality_cut)

結果:

python 利用panda 實現列聯表(交叉表)

交叉分組

詳細分析

從邏輯上來看, 為了達到對示例數據的交叉分組, 需要完成以下工作:

將數據以quality列進行分組.

將每個分組的數據分別進行cut, 以10為間隔.

將cut過的數據, 以cut的范圍為列進行分組

將所有數據組合到一起, row為quality, columns為cut的范圍

步驟1, pandasgroupby(...)接口, 會按照指定的列進行分組處理, 每一個分組, 存儲相同類別的數據

<class ’pandas.core.frame.DataFrame’> quality price0 bad 181 bad 176 bad 811 bad 13

而我們需要的, 只是price這列的數據, 所以單獨將這列拿出來, 進行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()的廣播特性, 每一個分組的數據都會經過上述幾個步驟的處理, 最后與第一次分組row進行組合.

后記

估計能力有限, 這個問題想了很長時間, 沒想到pandas這么可以這么方便達成交叉分組的效果. 思考的時候主要是卡在數據組合上, 當數據量很大時通過多個步驟進行數據組合, 肯定是低效而且錯誤的. 最后仔細研究了groupby, dataframe, series, dataframeIndex等數據模型, 使用廣播特性用幾句代碼就完成了. 證明了pandas的高性能, 也提醒自己遇見問題一定要耐心分析。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 久久中文字幕久久久久 | 精品国产日韩亚洲一区二区 | 精品成人毛片一区二区视 | 久久99精品久久久久久青青91 | 日韩在线视频中文字幕 | 亚洲欧美一区二区三区国产精品 | 日本在线视频观看 | 久久国产精品视频 | 最刺激黄a大片免费网站 | 欧美另类自拍 | 91情国产l精品国产亚洲区 | 免费视频久久 | 欧美一级毛片欧美一级无片 | 成人免费ā片 | 久久久久国产一级毛片高清片 | a级成人毛片免费视频高清 a级高清观看视频在线看 | 欧美日韩永久久一区二区三区 | 一级毛片美国一级j毛片不卡 | 成人网18免费网站 | 日韩欧美一区二区久久 | 免费香蕉成视频成人网 | 成年人免费软件 | 国产99高清一区二区 | 国产草草影院ccyycom软件 | 国产精品9| 特黄视频 | 久久国产国内精品对话对白 | 亚洲一区二区免费视频 | 国产成人a毛片在线 | 免费国产成人18在线观看 | 91刘亦菲精品福利在线 | 欧美深夜影院 | 日韩欧美一及在线播放 | 手机看片在线精品观看 | 亚洲午夜精品一级在线播放放 | 色综合夜夜嗨亚洲一二区 | 欧美人体在线 | 深夜做爰性大片中文 | 精品日韩一区二区三区视频 | 情侣偷偷看的羞羞视频网站 | 最新久久免费视频 |