collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键
Hadley Wickham(許多熱門R語言包的作者)創造了一個用于表示分組運算的術語"split-apply-combine"(拆分-應用-合并),這個詞很好的描述了整個過程。分組運算的第一個階段,pandas對象(無論是Series、DataFrame還是其他的)中的數據會根據你所提供的一個或多個鍵被拆分(split)為多組。拆分操作是在對象的特定軸上執行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上進行分組。然后,將一個函數應用(apply)到各個分組并產生一個新值。最后,所有這些函數的執行結果會被合并(combine)到最終的結果對象中去。
PART I. groupby方法PART II. GroupBy對象i) GroupBy對象ii) 對/GroupBy對象進行迭代和轉化iii)GroupBy對象的常用方法PART II. groupby方法的分組鍵i) 列名作為分組鍵df.groupby('key1').mean()df.groupby(['key1','key2']).mean()ii) 列表作為分組鍵df.groupby(l)['size'].count()iii) 數組作為分組鍵df.groupby([states,year])['data1'].mean()iv) 字典作為分組鍵df.groupby(mapping, axis=1).sum()v) Series作為分組鍵people.groupby(map_series, axis=1).count()df.groupby([df['key1'],df['key2']]).mean()vi) 索引作為分組鍵df.groupby(level='cty',axis=1).count()df.groupby(level=0,axis=1).count()vii) dtype作為分組鍵df.groupby(df.dtypes,axis=1).size()viii)函數作為分組鍵people.groupby(len).sum()df.groupby(lambda x: x.day)['volume'].sum()ix) 函數跟數組、列表、字典、Series混合使用作為分組鍵people.groupby([len,key_list]).sum()PART I . groupby方法
groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)by : mapping, function, label, or list of labelsUsed to determine the groups for the groupby.If ``by`` is a function, it's called on each value of the object'sindex. If a dict or Series is passed, the Series or dict VALUESwill be used to determine the groups (the Series' values are firstaligned; see ``.align()`` method). If an ndarray is passed, thevalues are used as-is determine the groups. A label or list oflabels may be passed to group by the columns in ``self``. Noticethat a tuple is interpreted a (single) key.axis : {0 or 'index', 1 or 'columns'}, default 0Split along rows (0) or columns (1).level : int, level name, or sequence of such, default NoneIf the axis is a MultiIndex (hierarchical), group by a particularlevel or levels.as_index : bool, default TrueFor aggregated output, return object with group labels as theindex. Only relevant for DataFrame input. as_index=False iseffectively "SQL-style" grouped output.sort : bool, default TrueSort group keys. Get better performance by turning this off.Note this does not influence the order of observations within eachgroup. Groupby preserves the order of rows within each group.group_keys : bool, default TrueWhen calling apply, add group keys to index to identify pieces.squeeze : bool, default FalseReduce the dimensionality of the return type if possible,otherwise return a consistent type.observed : bool, default FalseThis only applies if any of the groupers are Categoricals.If True: only show observed values for categorical groupers.If False: show all values for categorical groupers.重點參數:by axis level as_indexPART II. GroupBy對象
i)GroupBy對象
假設想要按key1進行分組,并計算data1列的平均值。實現該功能的方式有很多,而這里要用的是:訪問data1,并根據key1調用groupby:
變量grouped是一個SeriesGroupBy對象, 變量grouped2是一個DataFrameGroupBy對象。它們實際上還沒有進行任何計算,只是含有一些有關分組鍵'key1'的中間數據。換言之,該對象已經有了接下來對各分組執行運算所需的信息。
ii)對/GroupBy對象進行迭代和轉化
GroupBy對象支持迭代,可以產生一組二元元組(由分組名和數據塊組成)
分組鍵為單列
分組鍵為多列
通過列表生成式或list()方法可以把groupby對象,轉換為分組名+數據塊組成的元組的列表,其實我們還可以把groupby對象轉換為字典
iii)GroupBy對象的常用方法
GroupBy對象的常用方法除了常見的sum、mean、count等優化好的聚合函數,還有返回不同分組大小的Series的簡便方法size(),除此之外還可以對groupby對象傳入自定義的函數(agg/apply)。這部分的內容將放在下面一篇詳細展開。
例如,我們可以調用GroupBy的mean和count方法來計算分組平均值和分組計數:
groupby對象的size方法
groupby對象的size方法可以返回一個含有分組大小的Series
對groupby對象調用count不行嗎?倒也不是不行,就是格式不太友好。
所以還是size方法好
PART III. groupby方法的分組鍵
分組鍵的形式:
- 列表或數組,其長度與待分組的軸一樣
- 表示DataFrame某個列名的值
- 字典或Series,給出待分組軸上的值與分組名之間的對應關系
- 函數,用于處理軸索引或索引中的各個標簽
即 列表/數組、列名、字典、Series、函數
注意,后面三種都只是快捷方式,最終目的都是產生一組用于拆分對象的值,而且任何東西最終都會被轉換為數組。
i)列名作為分組鍵
可以用【一個列名字符串或一個列名字符串的列表】選取部分列進行聚合
對于由DataFrame產生的GroupBy對象,如果用一個列名字符串或一個列名字符串的列表對其進行索引,就能實現選取部分列進行聚合的目的。尤其對于大數據集,很可能只需要對部分列進行聚合。
df.groupby('key1')['data1'] 等價于 df['data1'].groupby(df['key1']) df.groupby('key1')[['data2']] 等價于 df[['data2']].groupby(df['key1')]在執行df.groupby('key1').mean()時,結果中沒有key2列。這是因為df['key2']不是數值數據(俗稱“麻煩列”),所以被從結果中排除了。默認情況下,所有數值列都會被聚合,雖然有時候可能會被過濾為一個子集。
聚合單列并以DataFrame形式得到結果
聚合單列并以Series形式得到結果
ii)列表作為分組鍵
iii)數組作為分組鍵
iv)字典作為分組鍵
列的分組關系如下:
只需把這個包含分組關系的字典傳給groupby即可:
v)Series作為分組鍵
Series也有字典同樣的功能,它可以被看作一個固定大小的映射。對于上面那個例子,如果用Series作為分組鍵,則pandas會檢查Series以確保其索引跟分組軸是對齊的。
多個Series作為分組鍵
.mean()的調用過程先略去不講。這里最重要的是,數據(Series)根據分組鍵進行了聚合,產生了一個新的Series,其索引為唯一值。之所以結果中索引的名稱為key1、key2,是因為原始DataFrame的列df['key1']、df['key2']就叫這個名字。
通過對兩個鍵進行分組,得到的Series具有一個層次化索引(由唯一的鍵值對組成),reshape一下:
vi)索引作為分組鍵
向level關鍵字傳入級別編號或名稱,根據索引級別分組
層次化索引最方便的地方在于它能夠根據索引級別進行聚合。要實現該目的,通過level關鍵字傳入級別編號或名稱即可:
vii)dtype作為分組鍵
在axis=1上根據dtype對列進行分組
viii)函數作為分組鍵
相較于字典或Series,Python函數在定義分組映射關系時可以更有創意且更為抽象。任何被當作分組鍵的函數都會在各個索引值上被調用一次,其返回值就會被用作分組名稱。( If ``by`` is a function, it's called on each value of the object's index.)
假設我們現在想根據人名的長度進行分組:
函數作為分組鍵很靈活,下面是12月1日1分鐘K線的數據,求這一天的總成交量,除了用df['volume'].sum(),還可以用將lambda函數作為分組鍵進行聚合的方法實現
>>>path = r"C:UsersbyqpzDesktop現貨策略現貨高頻新策略12.01.csv" >>>df = pd.read_csv(path, engine='python',encoding='utf_8_sig',index_col='time',parse_dates=True) >>>df['volume'].sum() 119939049.16099769 >>>df.groupby(lambda x: x.day)['volume'].sum() 1 1.199390e+08 Name: volume, dtype: float64ix)函數跟數組、列表、字典、Series混合使用作為分組鍵
混合使用不是問題,因為任何東西最終都會被轉換為數組:
總結
以上是生活随笔為你收集整理的collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么跟qtp脚本传参数_QTP多
- 下一篇: 找规律万能公式_有一个万能公式,可以帮你