用Python實(shí)現(xiàn)數(shù)據(jù)的透視表的方法
在處理數(shù)據(jù)時(shí),經(jīng)常需要對數(shù)據(jù)分組計(jì)算均值或者計(jì)數(shù),在Microsoft Excel中,可以通過透視表輕易實(shí)現(xiàn)簡單的分組運(yùn)算。而對于更加復(fù)雜的分組運(yùn)算,Python中pandas包可以幫助我們實(shí)現(xiàn)。
1 數(shù)據(jù)
首先引入幾個(gè)重要的包:
import pandas as pd import numpy as np from pandas import DataFrame,Series
通過代碼構(gòu)造數(shù)據(jù)集:
data=DataFrame({'key1':['a','b','c','a','c','a','b','a','c','a','b','c'],'key2':['one','two','three','two','one','one','three','one','two','three','one','two'],'num1':np.random.rand(12),'num2':np.random.randn(12)})
得到數(shù)據(jù)集如下:
data key1 key2 num1 num2 0 a one 0.268705 0.084091 1 b two 0.876707 0.217794 2 c three 0.229999 0.574402 3 a two 0.707990 -1.444415 4 c one 0.786064 0.343244 5 a one 0.587273 1.212391 6 b three 0.927396 1.505372 7 a one 0.295271 -0.497633 8 c two 0.292721 0.098814 9 a three 0.369788 -1.157426
2 交叉表—分類計(jì)數(shù)
按照不同類進(jìn)行計(jì)數(shù)統(tǒng)計(jì)是最常見透視功能,可以通
(1)crosstab
#函數(shù): crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
crosstab的index和columns是必須要指定復(fù)制的參數(shù):
pd.crosstab(data.key1,data.key2)
結(jié)果如下:
key2 one three two key1 a 3 1 1 b 0 1 1 c 1 1 1
想要在邊框處增加匯總項(xiàng)可以指定margin的值為True:
pd.crosstab(data.key1,data.key2,margins=True)
結(jié)果:
key2 one three two All key1 a 3 1 1 5 b 1 1 1 3 c 1 1 2 4 All 5 3 4 12
(2)pivot_table
函數(shù):
pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
使用pivot_table函數(shù)同樣可以實(shí)現(xiàn),運(yùn)算函數(shù)默認(rèn)值aggfunc='mean',指定為aggfunc='count'即可:
data.pivot_table('num1',index='key1',columns='key2',aggfunc='count')
結(jié)果相同:
key2 one three two key1 a 3 1 1 b 1 1 1 c 1 1 2
(3)groupby
通過groupby相對來說會更加復(fù)雜,首先需要對data按照key1和key2進(jìn)行聚類,然后進(jìn)行count運(yùn)算,再將key2的index重塑為columns:
data.groupby(['key1','key2'])['num1'].count().unstack()
結(jié)果:
key2 one three two key1 a 3 1 1 b 1 1 1 c 1 1 2
3 其它透視表運(yùn)算
(1)pivot_table
pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
要進(jìn)行何種運(yùn)算,只需要指定aggfunc即可。
默認(rèn)計(jì)算均值:
data.pivot_table(index='key1',columns='key2')
out:
num1 num2 key2 one three two one three two key1 a 0.193332 0.705657 0.203155 -0.165749 2.398164 -1.293595 b 0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530 c 0.496993 0.033673 0.206028 -0.115093 0.024650 0.077726
分類匯總呢并求和:
data.pivot_table(index='key1',columns='key2',aggfunc='sum')
結(jié)果:
num1 num2 key2 one three two one three two key1 a 0.579996 0.705657 0.203155 -0.497246 2.398164 -1.293595 b 0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530 c 0.496993 0.033673 0.412055 -0.115093 0.024650 0.155452
也可以使用其它自定義函數(shù):
#定義一個(gè)最大值減最小值的函數(shù) def max_min (group): return group.max()-group.min()
data.pivot_table(index='key1',columns='key2',aggfunc=max_min)
結(jié)果:
num1 num2 key2 one three two one three two key1 a 0.179266 0.0 0.000 3.109405 0.0 0.000000 b 0.000000 0.0 0.000 0.000000 0.0 0.000000 c 0.000000 0.0 0.177 0.000000 0.0 1.609466
(2)通過groupby
普通的函數(shù)如mean,sum可以直接應(yīng)用:
data.groupby(['key1','key2']).mean().unstack()
返回結(jié)果:
num1 num2 key2 one three two one three two key1 a 0.193332 0.705657 0.203155 -0.165749 2.398164 -1.293595 b 0.167947 0.204545 0.661460 0.555850 -0.522528 0.143530 c 0.496993 0.033673 0.206028 -0.115093 0.024650 0.077726
以上這篇用Python實(shí)現(xiàn)數(shù)據(jù)的透視表的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Python設(shè)置函數(shù)調(diào)用超時(shí),進(jìn)程卡住的問題
今天小編就為大家分享一篇解決Python設(shè)置函數(shù)調(diào)用超時(shí),進(jìn)程卡住的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python使用pynlpir進(jìn)行中文分詞并保留段落信息
nlpir是由張華平博士開發(fā)的中文自然處理工具,可以對中文文本進(jìn)行分詞、聚類分析等,本文主要介紹了使用pynlpir進(jìn)行中文分詞并保留段落信息的具體方法,希望對大家有所幫助2024-03-03Python趣味挑戰(zhàn)之實(shí)現(xiàn)簡易版音樂播放器
小伙伴們天天學(xué)編程應(yīng)該都學(xué)累了,今天特地給大家整理了這篇文章,讓大家在學(xué)習(xí)的時(shí)候也收貨快樂,文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下2021-05-05Django ORM 聚合查詢和分組查詢實(shí)現(xiàn)詳解
這篇文章主要介紹了Django ORM 聚合查詢和分組查詢實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python中Task封裝協(xié)程的知識點(diǎn)總結(jié)
在本篇內(nèi)容里小編給大家總結(jié)的是一篇關(guān)于python中Task封裝協(xié)程的知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2021-07-07Python使用樹狀圖實(shí)現(xiàn)可視化聚類詳解
一般情況下,我們都是使用散點(diǎn)圖進(jìn)行聚類可視化,但是某些的聚類算法可視化時(shí)散點(diǎn)圖并不理想,所以在這篇文章中,我們介紹如何使用樹狀圖(Dendrograms)對我們的聚類結(jié)果進(jìn)行可視化2023-03-03