摘要:最后使用聚合函數(shù),就得到了結(jié)果。從實(shí)現(xiàn)上看,返回的是一個(gè)結(jié)構(gòu),這個(gè)結(jié)構(gòu)必須調(diào)用聚合函數(shù)如之后,才會(huì)得到結(jié)構(gòu)為的數(shù)據(jù)結(jié)果。
介紹
每隔一段時(shí)間我都會(huì)去學(xué)習(xí)、回顧一下python中的新函數(shù)、新操作。這對(duì)于你后面的工作是有一定好處的。
本文重點(diǎn)介紹了pandas中g(shù)roupby、Grouper和agg函數(shù)的使用。這2個(gè)函數(shù)作用類似,都是對(duì)數(shù)據(jù)集中的一類屬性進(jìn)行聚合操作,比如統(tǒng)計(jì)一個(gè)用戶在每個(gè)月內(nèi)的全部花銷,統(tǒng)計(jì)某個(gè)屬性的最大、最小、累和、平均等數(shù)值。
其中,agg是pandas 0.20新引入的功能
groupby && Grouper首先,我們從網(wǎng)上把數(shù)據(jù)下載下來(lái),后面的操作都是基于這份數(shù)據(jù)的:
import pandas as pd df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=True") df["date"] = pd.to_datetime(df["date"]) df.head()
(圖片來(lái)自于jupyter notebook,強(qiáng)烈推薦使用它作為python的交互工具)
下面,我們統(tǒng)計(jì)"ext price"這個(gè)屬性在每個(gè)月的累和(sum)值,resample 只有在index為date類型的時(shí)候才能用:
df.set_index("date").resample("M")["ext price"].sum()
date 2014-01-31 185361.66 2014-02-28 146211.62 2014-03-31 203921.38 2014-04-30 174574.11 2014-05-31 165418.55 2014-06-30 174089.33 2014-07-31 191662.11 2014-08-31 153778.59 2014-09-30 168443.17 2014-10-31 171495.32 2014-11-30 119961.22 2014-12-31 163867.26 Freq: M, Name: ext price, dtype: float64
進(jìn)一步的,我們想知道每個(gè)用戶每個(gè)月的sum值,那么就需要一個(gè)groupby了:
df.set_index("date").groupby("name")["ext price"].resample("M").sum()
name date Barton LLC 2014-01-31 6177.57 2014-02-28 12218.03 2014-03-31 3513.53 2014-04-30 11474.20 2014-05-31 10220.17 2014-06-30 10463.73 2014-07-31 6750.48 2014-08-31 17541.46 2014-09-30 14053.61 2014-10-31 9351.68 2014-11-30 4901.14 2014-12-31 2772.90 Cronin, Oberbrunner and Spencer 2014-01-31 1141.75 2014-02-28 13976.26 2014-03-31 11691.62 2014-04-30 3685.44 2014-05-31 6760.11 2014-06-30 5379.67 2014-07-31 6020.30 2014-08-31 5399.58 2014-09-30 12693.74 2014-10-31 9324.37 2014-11-30 6021.11 2014-12-31 7640.60 Frami, Hills and Schmidt 2014-01-31 5112.34 2014-02-28 4124.53 2014-03-31 10397.44 2014-04-30 5036.18 2014-05-31 4097.87 2014-06-30 13192.19 ... Trantow-Barrows 2014-07-31 11987.34 2014-08-31 17251.65 2014-09-30 6992.48 2014-10-31 10064.27 2014-11-30 6550.10 2014-12-31 10124.23 White-Trantow 2014-01-31 13703.77 2014-02-28 11783.98 2014-03-31 8583.05 2014-04-30 19009.20 2014-05-31 5877.29 2014-06-30 14791.32 2014-07-31 10242.62 2014-08-31 12287.21 2014-09-30 5315.16 2014-10-31 19896.85 2014-11-30 9544.61 2014-12-31 4806.93 Will LLC 2014-01-31 20953.87 2014-02-28 13613.06 2014-03-31 9838.93 2014-04-30 6094.94 2014-05-31 11856.95 2014-06-30 2419.52 2014-07-31 11017.54 2014-08-31 1439.82 2014-09-30 4345.99 2014-10-31 7085.33 2014-11-30 3210.44 2014-12-31 12561.21 Name: ext price, Length: 240, dtype: float64
結(jié)果肯定是對(duì)的,但是不夠完美。我們可以使用Grouper寫得更加簡(jiǎn)潔:
# df.set_index("date").groupby("name")["ext price"].resample("M").sum() df.groupby(["name", pd.Grouper(key="date", freq="M")])["ext price"].sum()
結(jié)果和上面?一樣,就不列出來(lái)了。
顯然,這種寫法多敲了很多次鍵盤,那么它的好處是啥呢?
首先,邏輯上更加直接,當(dāng)你敲代碼完成以上統(tǒng)計(jì)的時(shí)候,你首先想到的就是groupby操作,而set_index, resample好像不會(huì)立馬想到。想到了groupby這個(gè)"動(dòng)作"之后,你就會(huì)緊接著想按照哪個(gè)key來(lái)操作,此時(shí)
你只需要用字符串,或者Grouper把key定義好就行了。最后使用聚合函數(shù),就得到了結(jié)果。所以,從人類的
思考角度看,后者更容易記憶。
另外,Grouper里的freq可以方便的改成其他周期參數(shù)(resample也可以),比如:
# 按照年度,且截止到12月最后一天統(tǒng)計(jì)ext price的sum值 df.groupby(["name", pd.Grouper(key="date", freq="A-DEC")])["ext price"].sum()
name date Barton LLC 2014-12-31 109438.50 Cronin, Oberbrunner and Spencer 2014-12-31 89734.55 Frami, Hills and Schmidt 2014-12-31 103569.59 Fritsch, Russel and Anderson 2014-12-31 112214.71 Halvorson, Crona and Champlin 2014-12-31 70004.36 Herman LLC 2014-12-31 82865.00 Jerde-Hilpert 2014-12-31 112591.43 Kassulke, Ondricka and Metz 2014-12-31 86451.07 Keeling LLC 2014-12-31 100934.30 Kiehn-Spinka 2014-12-31 99608.77 Koepp Ltd 2014-12-31 103660.54 Kuhn-Gusikowski 2014-12-31 91094.28 Kulas Inc 2014-12-31 137351.96 Pollich LLC 2014-12-31 87347.18 Purdy-Kunde 2014-12-31 77898.21 Sanford and Sons 2014-12-31 98822.98 Stokes LLC 2014-12-31 91535.92 Trantow-Barrows 2014-12-31 123381.38 White-Trantow 2014-12-31 135841.99 Will LLC 2014-12-31 104437.60 Name: ext price, dtype: float64agg
從0.20.1開(kāi)始,pandas引入了agg函數(shù),它提供基于列的聚合操作。而groupby可以看做是基于行,或者說(shuō)index的聚合操作。
從實(shí)現(xiàn)上看,groupby返回的是一個(gè)DataFrameGroupBy結(jié)構(gòu),這個(gè)結(jié)構(gòu)必須調(diào)用聚合函數(shù)(如sum)之后,才會(huì)得到結(jié)構(gòu)為Series的數(shù)據(jù)結(jié)果。
而agg是DataFrame的直接方法,返回的也是一個(gè)DataFrame。當(dāng)然,很多功能用sum、mean等等也可以實(shí)現(xiàn)。但是agg更加簡(jiǎn)潔, 而且傳給它的函數(shù)可以是字符串,也可以自定義,參數(shù)是column對(duì)應(yīng)的子DataFrame
舉個(gè)栗子?吧:
df[["ext price", "quantity", "unit price"]].agg(["sum", "mean"])
怎么樣,是不是比使用
df[["ext price", "quantity"]].sum() df["unit price"].mean()
簡(jiǎn)潔多了?
上例中,你還可以針對(duì)不同的列使用不同的聚合函數(shù):
df.agg({"ext price": ["sum", "mean"], "quantity": ["sum", "mean"], "unit price": ["mean"]})
另外,自定義函數(shù)怎么用呢,也是so easy.
比如,我想統(tǒng)計(jì)sku中,購(gòu)買次數(shù)最多的產(chǎn)品編號(hào),可以這樣做:
# 這里的x是sku對(duì)應(yīng)的column get_max = lambda x: x.value_counts(dropna=False).index[0] df.agg({"ext price": ["sum", "mean"], "quantity": ["sum", "mean"], "unit price": ["mean"], "sku": [get_max]})
get_max = lambda x: x.value_counts(dropna=False).index[0] # python就是靈活啊。 get_max.__name__ = "most frequent" df.agg({"ext price": ["sum", "mean"], "quantity": ["sum", "mean"], "unit price": ["mean"], "sku": [get_max]})
另外,還有一個(gè)小問(wèn)題,那就是如果你希望輸出的列按照某個(gè)順序排列,可以使用collections的OrderedDict:
get_max = lambda x: x.value_counts(dropna=False).index[0] get_max.__name__ = "most frequent" import collections agg_dict = { "ext price": ["sum", "mean"], "quantity": ["sum", "mean"], "unit price": ["mean"], "sku": [get_max]} # 按照列名的長(zhǎng)度排序。 OrderedDict的順序是跟插入順序一致的 df.agg(collections.OrderedDict(sorted(agg_dict.items(), key = lambda x: len(x[0]))))總結(jié)
好好學(xué)習(xí),天天向上!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41042.html
摘要:一大熊貓世界來(lái)去自如的老生常談,從基礎(chǔ)來(lái)看,我們?nèi)匀魂P(guān)心對(duì)于與外部數(shù)據(jù)是如何交互的。函數(shù)受限制問(wèn)題唯一重要的參數(shù),標(biāo)志著一個(gè)的第個(gè)頁(yè)將會(huì)被取出。數(shù)據(jù)分析入門之總結(jié)基礎(chǔ)一歡迎來(lái)翔的博客查看完成版。 一.大熊貓世界來(lái)去自如:Pandas的I/O 老生常談,從基礎(chǔ)來(lái)看,我們?nèi)匀魂P(guān)心pandas對(duì)于與外部數(shù)據(jù)是如何交互的。 1.1 結(jié)構(gòu)化數(shù)據(jù)輸入輸出 read_csv與to_csv 是?對(duì)...
摘要:直播數(shù)據(jù)分析針對(duì)直播間這個(gè)時(shí)間段的數(shù)據(jù)分析基礎(chǔ)數(shù)據(jù)展示以上數(shù)據(jù)是從直播間的彈幕中提取的相關(guān)數(shù)據(jù)每個(gè)字段解釋為唯一標(biāo)識(shí)用戶名發(fā)送的信息用戶等級(jí)牌子牌子等級(jí)發(fā)言房間號(hào)依賴數(shù)據(jù)處理基礎(chǔ)準(zhǔn)備根據(jù)牌子名稱統(tǒng)計(jì)最大值最小值平均值計(jì)算牌子的最大值最小值 直播數(shù)據(jù)分析 針對(duì)douyu_60937 直播間 (2018/11/19 19:04:18 - 2018/11/20 7:56:42) 這個(gè)時(shí)間...
pandas其實(shí)匯集了python函數(shù)的一個(gè)數(shù)據(jù)庫(kù),主要是用來(lái)調(diào)用數(shù)據(jù)的,作為其中的聚合函數(shù),那么,其中的函數(shù)agg的具體用法是怎么樣的呢?下面就給大家詳細(xì)的解答下。 今天看到pandas的聚合函數(shù)agg,比較陌生,平時(shí)的工作中處理數(shù)據(jù)的時(shí)候使用的也比較少,為了加深印象,總結(jié)一下使用的方法,其實(shí)還是挺好用的?! ataFrame.agg(func,axis=0,*args,**kwargs...
摘要:是一個(gè)數(shù)據(jù)分析的開(kāi)源庫(kù)。與表格或關(guān)系數(shù)據(jù)庫(kù)中的表非常神似。注意帶有一個(gè)索引,類似于關(guān)系數(shù)據(jù)庫(kù)中的主鍵。的統(tǒng)計(jì)函數(shù)分組與聚合通過(guò)方法,可以對(duì)數(shù)據(jù)組施加一系列的函數(shù)。函數(shù)的作用是串聯(lián),追加數(shù)據(jù)行使用函數(shù)。 pandas(Python data analysis)是一個(gè)Python數(shù)據(jù)分析的開(kāi)源庫(kù)。pandas兩種數(shù)據(jù)結(jié)構(gòu):DataFrame和Series 安裝:pandas依賴于NumPy...
摘要:數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑數(shù)據(jù)聚合與分組運(yùn)算數(shù)據(jù)規(guī)整化清理轉(zhuǎn)換合并重塑合并數(shù)據(jù)集可根據(jù)一個(gè)或多個(gè)鍵將不同中的行鏈接起來(lái)。函數(shù)根據(jù)樣本分位數(shù)對(duì)數(shù)據(jù)進(jìn)行面元?jiǎng)澐?。字典或,給出待分組軸上的值與分組名之間的對(duì)應(yīng)關(guān)系。 本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書(shū)本有出入。 在前幾篇中我們介紹了 NumPy、pandas、matplotlib 三個(gè)...
閱讀 3335·2021-11-23 09:51
閱讀 2977·2021-10-28 09:33
閱讀 933·2021-10-08 10:04
閱讀 3730·2021-09-22 15:13
閱讀 1046·2019-08-30 15:55
閱讀 2932·2019-08-30 15:44
閱讀 596·2019-08-30 13:04
閱讀 2961·2019-08-30 12:56