Python處理大數據的2個神奇操作
Python有個處理大數據的庫,結合xlrd庫,在做一些大數據的處理統計工作的時候很好用,譬如做性能測試,你的結果數據如何統計,python有個庫pandas,這個就很擅長做這個工作,這里就講2個pandas的騷操作。 pandas中groupby、Grouper和agg函數的使用。這2個函數作用類似,都是對數據集中的一類屬性進行聚合操作,比如統計一個用戶在每個月內的全部花銷,統計某個屬性的最大、最小、累和、平均等數值。

統計“ext price”這個屬性在每個月的累和(sum)值
- import pandas as pd
- import collections
- df = pd.read_excel("D:/Download/chrome/sample-salesv3.xlsx")
- #print (df.head(10))
- df["date"] = pd.to_datetime(df["date"])
- # print (df.head(10))
- df1 = df.set_index("date").resample("M")['ext price'].sum()
- # print(df1.head())

統計每個用戶每個月"ext price"這個屬性的sum值,利用Grouper
- df2 = df.groupby(["name",pd.Grouper(key = "date",freq="M")])["ext price"]
- print(df2.head(10))

Agg
agg函數,它提供基于列的聚合操作。而groupby可以看做是基于行,或者說index的聚合操作。
從實現上看,groupby返回的是一個DataFrameGroupBy結構,這個結構必須調用聚合函數(如sum)之后,才會得到結構為Series的數據結果。
而agg是DataFrame的直接方法,返回的也是一個DataFrame。當然,很多功能用sum、mean等等也可以實現。但是agg更加簡潔, 而且傳給它的函數可以是字符串,也可以自定義,參數是column對應的子DataFrame
獲取"ext price","quantity","unit price"3列的各自的累計值和均值
- df3 = df[["ext price","quantity","unit price"]].agg(["sum","mean"])
- print(df3.head())

可以針對不同的列使用不同的聚合函數
- df4 = df.agg({"ext price":["sum","mean"],"quantity":["sum","mean"],"unit price":["mean"]})
- print(df4.head())

也可以自定義函數,比如,統計sku中,購買次數最多的產品編號,通過lambda表達式來做。
- #統計sku中,購買次數最多的產品編號
- get_max = lambda x:x.value_counts(dropna=False).index[0]
- get_max.__name__ = "most frequent"
- df5 = df.agg({"ext price":["sum","mean"],
- "quantity":["sum","mean"],
- "unit price":["mean"],
- "sku":[get_max]
- })
- print(df5)

如果希望輸出的列按照某個順序排列,可以使用collections的OrderedDict
- agg_dict = {
- "ext price":["sum","mean"],
- "quantity":["sum","mean"],
- "unit price":["mean"],
- "sku":[get_max]
- }
- #按照列名的長度排序。OrderedDict的順序是跟插入順序一致的
- df6 = df.agg(collections.OrderedDict(sorted(agg_dict.items(),key=lambda x:len(x[0]))))
- print(df6)

源數據的鏈接:https://github.com/chris1610/pbpython/tree/master/data