collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键
Hadley Wickham(許多熱門R語(yǔ)言包的作者)創(chuàng)造了一個(gè)用于表示分組運(yùn)算的術(shù)語(yǔ)"split-apply-combine"(拆分-應(yīng)用-合并),這個(gè)詞很好的描述了整個(gè)過程。分組運(yùn)算的第一個(gè)階段,pandas對(duì)象(無論是Series、DataFrame還是其他的)中的數(shù)據(jù)會(huì)根據(jù)你所提供的一個(gè)或多個(gè)鍵被拆分(split)為多組。拆分操作是在對(duì)象的特定軸上執(zhí)行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上進(jìn)行分組。然后,將一個(gè)函數(shù)應(yīng)用(apply)到各個(gè)分組并產(chǎn)生一個(gè)新值。最后,所有這些函數(shù)的執(zhí)行結(jié)果會(huì)被合并(combine)到最終的結(jié)果對(duì)象中去。
PART I. groupby方法PART II. GroupBy對(duì)象i) GroupBy對(duì)象ii) 對(duì)/GroupBy對(duì)象進(jìn)行迭代和轉(zhuǎn)化iii)GroupBy對(duì)象的常用方法PART II. groupby方法的分組鍵i) 列名作為分組鍵df.groupby('key1').mean()df.groupby(['key1','key2']).mean()ii) 列表作為分組鍵df.groupby(l)['size'].count()iii) 數(shù)組作為分組鍵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)函數(shù)作為分組鍵people.groupby(len).sum()df.groupby(lambda x: x.day)['volume'].sum()ix) 函數(shù)跟數(shù)組、列表、字典、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.重點(diǎn)參數(shù):by axis level as_indexPART II. GroupBy對(duì)象
i)GroupBy對(duì)象
假設(shè)想要按key1進(jìn)行分組,并計(jì)算data1列的平均值。實(shí)現(xiàn)該功能的方式有很多,而這里要用的是:訪問data1,并根據(jù)key1調(diào)用groupby:
變量grouped是一個(gè)SeriesGroupBy對(duì)象, 變量grouped2是一個(gè)DataFrameGroupBy對(duì)象。它們實(shí)際上還沒有進(jìn)行任何計(jì)算,只是含有一些有關(guān)分組鍵'key1'的中間數(shù)據(jù)。換言之,該對(duì)象已經(jīng)有了接下來對(duì)各分組執(zhí)行運(yùn)算所需的信息。
ii)對(duì)/GroupBy對(duì)象進(jìn)行迭代和轉(zhuǎn)化
GroupBy對(duì)象支持迭代,可以產(chǎn)生一組二元元組(由分組名和數(shù)據(jù)塊組成)
分組鍵為單列
分組鍵為多列
通過列表生成式或list()方法可以把groupby對(duì)象,轉(zhuǎn)換為分組名+數(shù)據(jù)塊組成的元組的列表,其實(shí)我們還可以把groupby對(duì)象轉(zhuǎn)換為字典
iii)GroupBy對(duì)象的常用方法
GroupBy對(duì)象的常用方法除了常見的sum、mean、count等優(yōu)化好的聚合函數(shù),還有返回不同分組大小的Series的簡(jiǎn)便方法size(),除此之外還可以對(duì)groupby對(duì)象傳入自定義的函數(shù)(agg/apply)。這部分的內(nèi)容將放在下面一篇詳細(xì)展開。
例如,我們可以調(diào)用GroupBy的mean和count方法來計(jì)算分組平均值和分組計(jì)數(shù):
groupby對(duì)象的size方法
groupby對(duì)象的size方法可以返回一個(gè)含有分組大小的Series
對(duì)groupby對(duì)象調(diào)用count不行嗎?倒也不是不行,就是格式不太友好。
所以還是size方法好
PART III. groupby方法的分組鍵
分組鍵的形式:
- 列表或數(shù)組,其長(zhǎng)度與待分組的軸一樣
- 表示DataFrame某個(gè)列名的值
- 字典或Series,給出待分組軸上的值與分組名之間的對(duì)應(yīng)關(guān)系
- 函數(shù),用于處理軸索引或索引中的各個(gè)標(biāo)簽
即 列表/數(shù)組、列名、字典、Series、函數(shù)
注意,后面三種都只是快捷方式,最終目的都是產(chǎn)生一組用于拆分對(duì)象的值,而且任何東西最終都會(huì)被轉(zhuǎn)換為數(shù)組。
i)列名作為分組鍵
可以用【一個(gè)列名字符串或一個(gè)列名字符串的列表】選取部分列進(jìn)行聚合
對(duì)于由DataFrame產(chǎn)生的GroupBy對(duì)象,如果用一個(gè)列名字符串或一個(gè)列名字符串的列表對(duì)其進(jìn)行索引,就能實(shí)現(xiàn)選取部分列進(jìn)行聚合的目的。尤其對(duì)于大數(shù)據(jù)集,很可能只需要對(duì)部分列進(jìn)行聚合。
df.groupby('key1')['data1'] 等價(jià)于 df['data1'].groupby(df['key1']) df.groupby('key1')[['data2']] 等價(jià)于 df[['data2']].groupby(df['key1')]在執(zhí)行df.groupby('key1').mean()時(shí),結(jié)果中沒有key2列。這是因?yàn)閐f['key2']不是數(shù)值數(shù)據(jù)(俗稱“麻煩列”),所以被從結(jié)果中排除了。默認(rèn)情況下,所有數(shù)值列都會(huì)被聚合,雖然有時(shí)候可能會(huì)被過濾為一個(gè)子集。
聚合單列并以DataFrame形式得到結(jié)果
聚合單列并以Series形式得到結(jié)果
ii)列表作為分組鍵
iii)數(shù)組作為分組鍵
iv)字典作為分組鍵
列的分組關(guān)系如下:
只需把這個(gè)包含分組關(guān)系的字典傳給groupby即可:
v)Series作為分組鍵
Series也有字典同樣的功能,它可以被看作一個(gè)固定大小的映射。對(duì)于上面那個(gè)例子,如果用Series作為分組鍵,則pandas會(huì)檢查Series以確保其索引跟分組軸是對(duì)齊的。
多個(gè)Series作為分組鍵
.mean()的調(diào)用過程先略去不講。這里最重要的是,數(shù)據(jù)(Series)根據(jù)分組鍵進(jìn)行了聚合,產(chǎn)生了一個(gè)新的Series,其索引為唯一值。之所以結(jié)果中索引的名稱為key1、key2,是因?yàn)樵糄ataFrame的列df['key1']、df['key2']就叫這個(gè)名字。
通過對(duì)兩個(gè)鍵進(jìn)行分組,得到的Series具有一個(gè)層次化索引(由唯一的鍵值對(duì)組成),reshape一下:
vi)索引作為分組鍵
向level關(guān)鍵字傳入級(jí)別編號(hào)或名稱,根據(jù)索引級(jí)別分組
層次化索引最方便的地方在于它能夠根據(jù)索引級(jí)別進(jìn)行聚合。要實(shí)現(xiàn)該目的,通過level關(guān)鍵字傳入級(jí)別編號(hào)或名稱即可:
vii)dtype作為分組鍵
在axis=1上根據(jù)dtype對(duì)列進(jìn)行分組
viii)函數(shù)作為分組鍵
相較于字典或Series,Python函數(shù)在定義分組映射關(guān)系時(shí)可以更有創(chuàng)意且更為抽象。任何被當(dāng)作分組鍵的函數(shù)都會(huì)在各個(gè)索引值上被調(diào)用一次,其返回值就會(huì)被用作分組名稱。( If ``by`` is a function, it's called on each value of the object's index.)
假設(shè)我們現(xiàn)在想根據(jù)人名的長(zhǎng)度進(jìn)行分組:
函數(shù)作為分組鍵很靈活,下面是12月1日1分鐘K線的數(shù)據(jù),求這一天的總成交量,除了用df['volume'].sum(),還可以用將lambda函數(shù)作為分組鍵進(jìn)行聚合的方法實(shí)現(xiàn)
>>>path = r"C:UsersbyqpzDesktop現(xiàn)貨策略現(xiàn)貨高頻新策略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)函數(shù)跟數(shù)組、列表、字典、Series混合使用作為分組鍵
混合使用不是問題,因?yàn)槿魏螙|西最終都會(huì)被轉(zhuǎn)換為數(shù)組:
總結(jié)
以上是生活随笔為你收集整理的collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java怎么跟qtp脚本传参数_QTP多
- 下一篇: 找规律万能公式_有一个万能公式,可以帮你