groupby 方法是pandas中的分組方法,對(duì)數(shù)據(jù)框采用 groupby 方法后,返回的是 DataFrameGroupBy 對(duì)象,一般分組操作后會(huì)進(jìn)行聚合操作。
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站服務(wù),網(wǎng)站設(shè)計(jì),綿陽(yáng)服務(wù)器托管等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出創(chuàng)新互聯(lián)。
對(duì)數(shù)據(jù)框按 A 列進(jìn)行分組,產(chǎn)生分組數(shù)據(jù)框。分組數(shù)據(jù)框是可迭代對(duì)象,可以進(jìn)行循環(huán)遍歷,可以看出在循環(huán)中,每個(gè)元素的類型是元組,
元組的第一個(gè)元素是分組值,第二個(gè)元素是對(duì)應(yīng)的分組數(shù)據(jù)框。
可以對(duì)分組后的數(shù)據(jù)框直接使用聚合方法 agg ,對(duì)分組數(shù)據(jù)框的每一列計(jì)算統(tǒng)計(jì)函數(shù)值。
可以根據(jù)數(shù)據(jù)框外的序列數(shù)據(jù)對(duì)數(shù)據(jù)框進(jìn)行分組,需要注意 序列長(zhǎng)度需要與數(shù)據(jù)框行數(shù)相同 。
可以根據(jù)數(shù)據(jù)框的多列對(duì)數(shù)據(jù)框進(jìn)行分組。
根據(jù) A , B 列進(jìn)行分組,然后求和。
可以根據(jù)索引對(duì)數(shù)據(jù)框進(jìn)行分組,需要設(shè)置 level 參數(shù)。
數(shù)據(jù)框只有一層索引,設(shè)置參數(shù) level=0 。
當(dāng)數(shù)據(jù)框索引有多層時(shí),也可以根據(jù)需求設(shè)置 level 參數(shù),完成分組聚合。
設(shè)置 level 參數(shù),如需要根據(jù)第一層索引,即 id1 進(jìn)行分組,可以設(shè)置 level=0 或 level='id1' 完成分組聚合。
分組后一般會(huì)進(jìn)行聚合操作,用 agg 方法進(jìn)行聚合。
對(duì)分組后數(shù)據(jù)框使用單個(gè)函數(shù)進(jìn)行聚合,單個(gè)聚合函數(shù)會(huì)對(duì)每列進(jìn)行計(jì)算,然后合并返回。聚合函數(shù)以字符串的形式傳入。
可以對(duì)分組后的數(shù)據(jù)指定列進(jìn)行分組聚合。需要注意 子列需要用[]包裹 。
聚合函數(shù)也可以傳入自定義的匿名函數(shù)。
聚合函數(shù)可以是多個(gè)函數(shù)。聚合時(shí),多個(gè)聚合函數(shù)會(huì)對(duì)每列進(jìn)行計(jì)算,然后合并返回。聚合函數(shù)以列表的形式傳入。
聚合返回后的數(shù)據(jù)列名有兩層索引,第一層是聚合的列名,第二層是使用的聚合函數(shù)名。如果需要對(duì)返回的聚合函數(shù)名重命名,
需要在傳參時(shí),傳入元組,第一個(gè)元素為聚合函數(shù)名,第二個(gè)元素為聚合函數(shù)。
同樣,也可以傳入匿名函數(shù)。
如果需要對(duì)不同的列進(jìn)行不同的聚合計(jì)算,則需要傳入字典的形式。
可以重命名聚合后的列名,注意 只能對(duì)一列傳入一個(gè)聚合函數(shù)時(shí)有效 。
pandas提供了一個(gè)靈活高效的groupby功能,它使你能以一種自然的方式對(duì)數(shù)據(jù)集進(jìn)行切片、切塊、摘要等操作。根據(jù)一個(gè)或多個(gè)鍵(可以是函數(shù)、數(shù)組或DataFrame列名)拆分pandas對(duì)象。計(jì)算分組摘要統(tǒng)計(jì),如計(jì)數(shù)、平均值、標(biāo)準(zhǔn)差,或用戶自定義函數(shù)。對(duì)DataFrame的列應(yīng)用各種各樣的函數(shù)。應(yīng)用組內(nèi)轉(zhuǎn)換或其他運(yùn)算,如規(guī)格化、線性回歸、排名或選取子集等。計(jì)算透視表或交叉表。執(zhí)行分位數(shù)分析以及其他分組分析。
1、首先來(lái)看看下面這個(gè)非常簡(jiǎn)單的表格型數(shù)據(jù)集(以DataFrame的形式):
123456789101112
import pandas as pd df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],... 'key2':['one', 'two', 'one', 'two', 'one'],... 'data1':np.random.randn(5),... 'data2':np.random.randn(5)}) df data1 data2 key1 key20 -0.410673 0.519378 a one1 -2.120793 0.199074 a two2 0.642216 -0.143671 b one3 0.975133 -0.592994 b two4 -1.017495 -0.530459 a one
假設(shè)你想要按key1進(jìn)行分組,并計(jì)算data1列的平均值,我們可以訪問(wèn)data1,并根據(jù)key1調(diào)用groupby:
123
grouped = df['data1'].groupby(df['key1']) groupedpandas.core.groupby.SeriesGroupBy object at 0x04120D70
變量grouped是一個(gè)GroupBy對(duì)象,它實(shí)際上還沒有進(jìn)行任何計(jì)算,只是含有一些有關(guān)分組鍵df['key1']的中間數(shù)據(jù)而已,然后我們可以調(diào)用GroupBy的mean方法來(lái)計(jì)算分組平均值:
12345
grouped.mean()key1a -1.182987b 0.808674dtype: float64
說(shuō)明:數(shù)據(jù)(Series)根據(jù)分組鍵進(jìn)行了聚合,產(chǎn)生了一個(gè)新的Series,其索引為key1列中的唯一值。之所以結(jié)果中索引的名稱為key1,是因?yàn)樵糄ataFrame的列df['key1']就叫這個(gè)名字。
2、如果我們一次傳入多個(gè)數(shù)組,就會(huì)得到不同的結(jié)果:
12345678
means = df['data1'].groupby([df['key1'], df['key2']]).mean() meanskey1 key2a one -0.714084 two -2.120793b one 0.642216 two 0.975133dtype: float64
通過(guò)兩個(gè)鍵對(duì)數(shù)據(jù)進(jìn)行了分組,得到的Series具有一個(gè)層次化索引(由唯一的鍵對(duì)組成):
12345
means.unstack()key2 one twokey1 a -0.714084 -2.120793b 0.642216 0.975133
在上面這些示例中,分組鍵均為Series。實(shí)際上,分組鍵可以是任何長(zhǎng)度適當(dāng)?shù)臄?shù)組:
12345678
states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio']) years = np.array([2005, 2005, 2006, 2005, 2006]) df['data1'].groupby([states, years]).mean()California 2005 -2.120793 2006 0.642216Ohio 2005 0.282230 2006 -1.017495dtype: float64
3、此外,你還可以將列名(可以是字符串、數(shù)字或其他Python對(duì)象)用作分組將:
123456789101112
df.groupby('key1').mean() data1 data2key1 a -1.182987 0.062665b 0.808674 -0.368333 df.groupby(['key1', 'key2']).mean() data1 data2key1 key2 a one -0.714084 -0.005540 two -2.120793 0.199074b one 0.642216 -0.143671 two 0.975133 -0.592994
說(shuō)明:在執(zhí)行df.groupby('key1').mean()時(shí),結(jié)果中沒有key2列。這是因?yàn)閐f['key2']不是數(shù)值數(shù)據(jù),所以被從結(jié)果中排除了。默認(rèn)情況下,所有數(shù)值列都會(huì)被聚合,雖然有時(shí)可能會(huì)被過(guò)濾為一個(gè)子集。
無(wú)論你準(zhǔn)備拿groupby做什么,都有可能會(huì)用到GroupBy的size方法,它可以返回一個(gè)含有分組大小的Series:
1234567
df.groupby(['key1', 'key2']).size()key1 key2a one 2 two 1b one 1 two 1dtype: int64
注意:分組鍵中的任何缺失值都會(huì)被排除在結(jié)果之外。
4、對(duì)分組進(jìn)行迭代
GroupBy對(duì)象支持迭代,可以產(chǎn)生一組二元元組(由分組名和數(shù)據(jù)塊組成)??纯聪旅孢@個(gè)簡(jiǎn)單的數(shù)據(jù)集:
12345678910111213
for name, group in df.groupby('key1'):... print(name)... print(group)...a data1 data2 key1 key20 -0.410673 0.519378 a one1 -2.120793 0.199074 a two4 -1.017495 -0.530459 a oneb data1 data2 key1 key22 0.642216 -0.143671 b one3 0.975133 -0.592994 b two
對(duì)于多重鍵的情況,元組的第一個(gè)元素將會(huì)是由鍵值組成的元組:
1234567891011121314151617
for (k1, k2), group in df.groupby(['key1', 'key2']):... print k1, k2... print group...a one data1 data2 key1 key20 -0.410673 0.519378 a one4 -1.017495 -0.530459 a onea two data1 data2 key1 key21 -2.120793 0.199074 a twob one data1 data2 key1 key22 0.642216 -0.143671 b oneb two data1 data2 key1 key23 0.975133 -0.592994 b two
當(dāng)然,你可以對(duì)這些數(shù)據(jù)片段做任何操作。有一個(gè)你可能會(huì)覺得有用的運(yùn)算:將這些數(shù)據(jù)片段做成一個(gè)字典:
1234567891011121314
pieces = dict(list(df.groupby('key1'))) pieces['b'] data1 data2 key1 key22 0.642216 -0.143671 b one3 0.975133 -0.592994 b two df.groupby('key1')pandas.core.groupby.DataFrameGroupBy object at 0x0413AE30 list(df.groupby('key1'))[('a', data1 data2 key1 key20 -0.410673 0.519378 a one1 -2.120793 0.199074 a two4 -1.017495 -0.530459 a one), ('b', data1 data2 key1 key22 0.642216 -0.143671 b one3 0.975133 -0.592994 b two)]
groupby默認(rèn)是在axis=0上進(jìn)行分組的,通過(guò)設(shè)置也可以在其他任何軸上進(jìn)行分組。那上面例子中的df來(lái)說(shuō),我們可以根據(jù)dtype對(duì)列進(jìn)行分組:
12345678910111213141516171819
df.dtypesdata1 float64data2 float64key1 objectkey2 objectdtype: object grouped = df.groupby(df.dtypes, axis=1) dict(list(grouped)){dtype('O'): key1 key20 a one1 a two2 b one3 b two4 a one, dtype('float64'): data1 data20 -0.410673 0.5193781 -2.120793 0.1990742 0.642216 -0.1436713 0.975133 -0.5929944 -1.017495 -0.530459}
1234567891011121314
groupedpandas.core.groupby.DataFrameGroupBy object at 0x041288F0 list(grouped)[(dtype('float64'), data1 data20 -0.410673 0.5193781 -2.120793 0.1990742 0.642216 -0.1436713 0.975133 -0.5929944 -1.017495 -0.530459), (dtype('O'), key1 key20 a one1 a two2 b one3 b two4 a one)]
5、選取一個(gè)或一組列
對(duì)于由DataFrame產(chǎn)生的GroupBy對(duì)象,如果用一個(gè)(單個(gè)字符串)或一組(字符串?dāng)?shù)組)列名對(duì)其進(jìn)行索引,就能實(shí)現(xiàn)選取部分列進(jìn)行聚合的目的,即:
123456
df.groupby('key1')['data1']pandas.core.groupby.SeriesGroupBy object at 0x06615FD0 df.groupby('key1')['data2']pandas.core.groupby.SeriesGroupBy object at 0x06615CB0 df.groupby('key1')[['data2']]pandas.core.groupby.DataFrameGroupBy object at 0x06615F10
和以下代碼是等效的:
123456
df['data1'].groupby([df['key1']])pandas.core.groupby.SeriesGroupBy object at 0x06615FD0 df[['data2']].groupby([df['key1']])pandas.core.groupby.DataFrameGroupBy object at 0x06615F10 df['data2'].groupby([df['key1']])pandas.core.groupby.SeriesGroupBy object at 0x06615E30
尤其對(duì)于大數(shù)據(jù)集,很可能只需要對(duì)部分列進(jìn)行聚合。例如,在前面那個(gè)數(shù)據(jù)集中,如果只需計(jì)算data2列的平均值并以DataFrame形式得到結(jié)果,代碼如下:
1234567891011121314
df.groupby(['key1', 'key2'])[['data2']].mean() data2key1 key2 a one -0.005540 two 0.199074b one -0.143671 two -0.592994 df.groupby(['key1', 'key2'])['data2'].mean()key1 key2a one -0.005540 two 0.199074b one -0.143671 two -0.592994Name: data2, dtype: float64
這種索引操作所返回的對(duì)象是一個(gè)已分組的DataFrame(如果傳入的是列表或數(shù)組)或已分組的Series(如果傳入的是標(biāo)量形式的單個(gè)列明):
12345678910
s_grouped = df.groupby(['key1', 'key2'])['data2'] s_groupedpandas.core.groupby.SeriesGroupBy object at 0x06615B10 s_grouped.mean()key1 key2a one -0.005540 two 0.199074b one -0.143671 two -0.592994Name: data2, dtype: float64
6、通過(guò)字典或Series進(jìn)行分組
除數(shù)組以外,分組信息還可以其他形式存在,來(lái)看一個(gè)DataFrame示例:
123456789101112
people = pd.DataFrame(np.random.randn(5, 5),... columns=['a', 'b', 'c', 'd', 'e'],... index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis']... ) people a b c d eJoe 0.306336 -0.139431 0.210028 -1.489001 -0.172998Steve 0.998335 0.494229 0.337624 -1.222726 -0.402655Wes 1.415329 0.450839 -1.052199 0.731721 0.317225Jim 0.550551 3.201369 0.669713 0.725751 0.577687Travis -2.013278 -2.010304 0.117713 -0.545000 -1.228323 people.ix[2:3, ['b', 'c']] = np.nan
假設(shè)已知列的分組關(guān)系,并希望根據(jù)分組計(jì)算列的總計(jì):
123456
mapping = {'a':'red', 'b':'red', 'c':'blue',... 'd':'blue', 'e':'red', 'f':'orange'} mapping{'a': 'red', 'c': 'blue', 'b': 'red', 'e': 'red', 'd': 'blue', 'f': 'orange'} type(mapping)type 'dict'
現(xiàn)在,只需將這個(gè)字典傳給groupby即可:
12345678910
by_column = people.groupby(mapping, axis=1) by_columnpandas.core.groupby.DataFrameGroupBy object at 0x066150F0 by_column.sum() blue redJoe -1.278973 -0.006092Steve -0.885102 1.089908Wes 0.731721 1.732554Jim 1.395465 4.329606Travis -0.427287 -5.251905
Series也有同樣的功能,它可以被看做一個(gè)固定大小的映射。對(duì)于上面那個(gè)例子,如果用Series作為分組鍵,則pandas會(huì)檢查Series以確保其索引跟分組軸是對(duì)齊的:
12345678910111213141516
map_series = pd.Series(mapping) map_seriesa redb redc blued bluee redf orangedtype: object people.groupby(map_series, axis=1).count() blue redJoe 2 3Steve 2 3Wes 1 2Jim 2 3Travis 2 3
7、通過(guò)函數(shù)進(jìn)行分組
相較于字典或Series,Python函數(shù)在定義分組映射關(guān)系時(shí)可以更有創(chuàng)意且更為抽象。任何被當(dāng)做分組鍵的函數(shù)都會(huì)在各個(gè)索引值上被調(diào)用一次,其返回值就會(huì)被用作分組名稱。
具體點(diǎn)說(shuō),以DataFrame為例,其索引值為人的名字。假設(shè)你希望根據(jù)人名的長(zhǎng)度進(jìn)行分組,雖然可以求取一個(gè)字符串長(zhǎng)度數(shù)組,但其實(shí)僅僅傳入len函數(shù)即可:
12345
people.groupby(len).sum() a b c d e3 2.272216 3.061938 0.879741 -0.031529 0.7219145 0.998335 0.494229 0.337624 -1.222726 -0.4026556 -2.013278 -2.010304 0.117713 -0.545000 -1.228323
將函數(shù)跟數(shù)組、列表、字典、Series混合使用也不是問(wèn)題,因?yàn)槿魏螙|西最終都會(huì)被轉(zhuǎn)換為數(shù)組:
1234567
key_list = ['one', 'one', 'one', 'two', 'two'] people.groupby([len, key_list]).min() a b c d e3 one 0.306336 -0.139431 0.210028 -1.489001 -0.172998 two 0.550551 3.201369 0.669713 0.725751 0.5776875 one 0.998335 0.494229 0.337624 -1.222726 -0.4026556 two -2.013278 -2.010304 0.117713 -0.545000 -1.228323
8、根據(jù)索引級(jí)別分組
層次化索引數(shù)據(jù)集最方便的地方在于它能夠根據(jù)索引級(jí)別進(jìn)行聚合。要實(shí)現(xiàn)該目的,通過(guò)level關(guān)鍵字傳入級(jí)別編號(hào)或名稱即可:
12345678910111213141516171819
columns = pd.MultiIndex.from_arrays([['US', 'US', 'US', 'JP', 'JP'],... [1, 3, 5, 1, 3]], names=['cty', 'tenor']) columnsMultiIndex[US 1, 3, 5, JP 1, 3] hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns) hier_dfcty US JP tenor 1 3 5 1 30 -0.166600 0.248159 -0.082408 -0.710841 -0.0971311 -1.762270 0.687458 1.235950 -1.407513 1.3040552 1.089944 0.258175 -0.749688 -0.851948 1.6877683 -0.378311 -0.078268 0.247147 -0.018829 0.744540 hier_df.groupby(level='cty', axis=1).count()cty JP US0 2 31 2 32 2 33 2 3
python中g(shù)roupby函數(shù)主要的作用是進(jìn)行數(shù)據(jù)的分組以及分組后地組內(nèi)運(yùn)算!
對(duì)于數(shù)據(jù)的分組和分組運(yùn)算主要是指groupby函數(shù)的應(yīng)用,具體函數(shù)的規(guī)則如下:
df[](指輸出數(shù)據(jù)的結(jié)果屬性名稱).groupby([df[屬性],df[屬性])(指分類的屬性,數(shù)據(jù)的限定語(yǔ),可以有多個(gè)).mean()(對(duì)于數(shù)據(jù)的計(jì)算方式——函數(shù)名稱)
另外,我們也可以過(guò)濾掉和忽略掉你不想要的組,而是返回一個(gè)類似索引對(duì)象。在這個(gè)對(duì)象中,我們分組時(shí)需要設(shè)置一個(gè)過(guò)濾條件,那么沒有通過(guò)的分組的元素被NaN 填充,這樣分組后被NaN 填充的數(shù)據(jù)就可以忽略了。
這部分同pandas的gorupby函數(shù)基本相同,實(shí)現(xiàn)對(duì)數(shù)據(jù)的分組歸類等等。
split·將數(shù)據(jù)分為多個(gè)獨(dú)立的組。
apply·對(duì)各個(gè)組進(jìn)行操作。
combine·將各個(gè)組合并為一個(gè)數(shù)據(jù)對(duì)象。
創(chuàng)建一個(gè)dataset
我對(duì)官網(wǎng)的例子加以修改以便更好的理解。
解釋下數(shù)據(jù)結(jié)構(gòu),創(chuàng)建了一個(gè)二維數(shù)據(jù)u(lat, lon),坐標(biāo)數(shù)據(jù)為latitude 和country ,強(qiáng)調(diào)一下這里創(chuàng)建的是dataset,而不是dataArray,分不清的可以再看看本系列的第一篇文章。坐標(biāo)數(shù)據(jù)不等于u的坐標(biāo)。創(chuàng)建coords部分都指明了latitude 和 country 都是針對(duì)lat的擴(kuò)展。
我們可以這樣理解,對(duì)于緯度的分類,我們可以按緯度的大小分,也就是"latitude": [10, 20, 30, 40] ; 我們也可以對(duì)緯度所在的國(guó)家分,"country": ("x", list("abba") ,那比如我們想求某個(gè)國(guó)家的數(shù)據(jù)的平均時(shí)就十分方便。
下邊我們進(jìn)行分組:
說(shuō)明第0和第4個(gè)數(shù)是國(guó)家a的,第2和第3是國(guó)家b的。
.groups換成.mean() 則就是對(duì)分組求平均,以此類推。
必須添加一個(gè)list才可以將其分類結(jié)果打印出來(lái)。直接打印DatasetGroupBy object是不能輸出結(jié)果的。
那么針對(duì)經(jīng)緯度的坐標(biāo)的分組怎么實(shí)現(xiàn)呢,比如說(shuō)選出區(qū)間在多少到多少之間的?
.groupby_bins() 函數(shù)可以解決這一問(wèn)題。
還是這個(gè)數(shù)據(jù),"latitude": [10, 20, 30, 40]
那我們想以25為界,分為兩組,0-25,25-50
在進(jìn)行了分組后,要對(duì)各個(gè)分組進(jìn)行計(jì)算。
我們先從dataset 中取出 u 這個(gè)dataarray
比如是實(shí)現(xiàn)前邊提到的按國(guó)家進(jìn)行數(shù)據(jù)平均,或者標(biāo)準(zhǔn)化
也可以通過(guò)map()函數(shù)使用一些自定義的函數(shù),比如說(shuō)標(biāo)準(zhǔn)化,
這個(gè)用法是官方提供的,但是我的Xarray版本過(guò)低,還不支持這種用法(Xarray會(huì)定期更新,以至于可能我介紹過(guò)的一些方法有了更簡(jiǎn)便的操作,大家可以在評(píng)論區(qū)留言)。
強(qiáng)調(diào)一句,Xarray官方的更新是比較快的,很可能我寫在這里的函數(shù)官方又給出了更新的版本,但是我沒辦法做到時(shí)刻與官方最新同步,所以如果遇到問(wèn)題,最好的解決辦法還是去查閱官方文檔的對(duì)應(yīng)部分。
前言分組原理
核心:
1.不論分組鍵是數(shù)組、列表、字典、Series、函數(shù),只要其與待分組變量的軸長(zhǎng)度一致都可以傳入groupby進(jìn)行分組。
2.默認(rèn)axis=0按行分組,可指定axis=1對(duì)列分組。
對(duì)數(shù)據(jù)進(jìn)行分組操作的過(guò)程可以概括為:split-apply-combine三步:
1.按照鍵值(key)或者分組變量將數(shù)據(jù)分組。
2.對(duì)于每組應(yīng)用我們的函數(shù),這一步非常靈活,可以是python自帶函數(shù),可以是我們自己編寫的函數(shù)。
3.將函數(shù)計(jì)算后的結(jié)果聚合。
1 分組模式及其對(duì)象
1.1 分組的一般模式
三個(gè)要素:分組依據(jù)、數(shù)據(jù)來(lái)源、操作及其返回結(jié)果
df.groupby(分組依據(jù))[數(shù)據(jù)來(lái)源].使用操作
1.2 分組依據(jù)的本質(zhì)
1.3Groupby 對(duì)象
通過(guò) ngroups 屬性,可以訪問(wèn)分為了多少組:
通過(guò) groups 屬性,可以返回從 組名映射到 組索引列表的字典:
當(dāng) size 作為 DataFrame 的屬性時(shí),返回的是表長(zhǎng)乘以表寬的大小,但在 groupby 對(duì)象上表示統(tǒng)計(jì)每個(gè)組的 元素個(gè)數(shù):
通過(guò) get_group 方法可以直接獲取所在組對(duì)應(yīng)的行,此時(shí)必須知道組的具體名字:
1.4 分組的三大操作
分組的三大操作:聚合、變換和過(guò)濾
2.聚合函數(shù)
2.1內(nèi)置聚合函數(shù)
包括如下函數(shù): max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多個(gè)函數(shù)
當(dāng)使用多個(gè)聚合函數(shù)時(shí),需要用列表的形式把內(nèi)置聚合函數(shù)的對(duì)應(yīng)的字符串傳入,先前提到的所有字符串都是合法的。
【b】對(duì)特定的列使用特定的聚合函數(shù)
對(duì)于方法和列的特殊對(duì)應(yīng),可以通過(guò)構(gòu)造字典傳入 agg 中實(shí)現(xiàn),其中字典以列名為鍵,以聚合字符串或字符串列表為值。
【c】使用自定義函數(shù)
在 agg 中可以使用具體的自定義函數(shù),需要注意傳入函數(shù)的參數(shù)是之前數(shù)據(jù)源中的列,逐列進(jìn)行計(jì)算
【d】聚合結(jié)果重命名 如果想要對(duì)結(jié)果進(jìn)行重命名,只需要將上述函數(shù)的位置改寫成元組,元組的第一個(gè)元素為新的名字,第二個(gè)位置為原來(lái)的函數(shù),包括聚合字符串和自定義函數(shù)
3 變換和過(guò)濾
3.1 變換函數(shù)與 transform 方法
變 換 函 數(shù) 的 返 回 值 為 同 長(zhǎng) 度 的 序 列, 最 常 用 的 內(nèi) 置 變 換 函 數(shù) 是 累 計(jì) 函 數(shù):cum- count/cumsum/cumprod/cummax/cummin ,它們的使用方式和聚合函數(shù)類似,只不過(guò)完成的是組內(nèi) 累計(jì)操作。
3.2 組索引與過(guò)濾
過(guò)濾在分組中是對(duì)于組的過(guò)濾,而索引是對(duì)于行的過(guò)濾
組過(guò)濾作為行過(guò)濾的推廣,指的是如果對(duì)一個(gè)組的全體所在行進(jìn)行統(tǒng)計(jì)的結(jié)果返回 True 則會(huì)被保留,F(xiàn)alse 則該組會(huì)被過(guò)濾,最后把所有未被過(guò)濾的組其對(duì)應(yīng)的所在行拼接起來(lái)作為 DataFrame 返回。
在 groupby 對(duì)象中,定義了 filter 方法進(jìn)行組的篩選,其中自定義函數(shù)的輸入?yún)?shù)為數(shù)據(jù)源構(gòu)成的 DataFrame 本身,在之前例子中定義的 groupby 對(duì)象中,傳入的就是 df[['Height', 'Weight']] ,因此所有表方法和屬性 都可以在自定義函數(shù)中相應(yīng)地使用,同時(shí)只需保證自定義函數(shù)的返回為布爾值即可。
4 跨列分組
4.1 apply 的引入
4.2 apply 的使用
在設(shè)計(jì)上,apply 的自定義函數(shù)傳入?yún)?shù)與 filter 完全一致,只不過(guò)后者只允許返回布爾值
【a】標(biāo)量情況:結(jié)果得到的是 Series ,索引與 agg 的結(jié)果一致
【b】Series 情況:得到的是 DataFrame ,行索引與標(biāo)量情況一致,列索引為 Series 的索引
【c】DataFrame 情況:得到的是 DataFrame ,行索引最內(nèi)層在每個(gè)組原先 agg 的結(jié)果索引上,再加一層返 回的 DataFrame 行索引,同時(shí)分組結(jié)果 DataFrame 的列索引和返回的 DataFrame 列索引一致
伴隨著大數(shù)據(jù)時(shí)代的到來(lái),Python的熱度居高不下,已成為職場(chǎng)人士必備的技能,它不僅可以從事網(wǎng)絡(luò)爬蟲、人工智能、Web開發(fā)、游戲開發(fā)等工作,還是數(shù)據(jù)分析的首選語(yǔ)言。那么問(wèn)題來(lái)了,利用Python數(shù)據(jù)分析可以做什么呢?簡(jiǎn)單來(lái)講,可以做的事情有很多,具體如下。
第一、檢查數(shù)據(jù)表
Python中使用shape函數(shù)來(lái)查看數(shù)據(jù)表的維度,也就是行數(shù)和列數(shù)。你可以使用info函數(shù)查看數(shù)據(jù)表的整體信息,使用dtypes函數(shù)來(lái)返回?cái)?shù)據(jù)格式。Lsnull是Python中檢查空置的函數(shù),你可以對(duì)整個(gè)數(shù)據(jù)進(jìn)行檢查,也可以單獨(dú)對(duì)某一列進(jìn)行空置檢查,返回的結(jié)果是邏輯值,包括空置返回True,不包含則返回False。使用unique函數(shù)查看唯一值,使用Values函數(shù)用來(lái)查看數(shù)據(jù)表中的數(shù)值。
第二,數(shù)據(jù)表清洗
Python中處理空值的方法比較靈活,可以使用Dropna函數(shù)用來(lái)刪除數(shù)據(jù)表中包括空值的數(shù)據(jù),也可以使用fillna函數(shù)對(duì)空值進(jìn)行填充。Python中dtype是查看數(shù)據(jù)格式的函數(shù),與之對(duì)應(yīng)的是asstype函數(shù),用來(lái)更改數(shù)據(jù)格式,Rename是更改名稱的函數(shù),drop_duplicate函數(shù)函數(shù)重復(fù)值,replace函數(shù)實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換。
第三,數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理是對(duì)清洗完的數(shù)據(jù)進(jìn)行整理以便后期統(tǒng)計(jì)和分析工作,主要包括數(shù)據(jù)表的合并、排序、數(shù)值分列、數(shù)據(jù)分組以及標(biāo)記等工作。在Python中可以使用merge函數(shù)對(duì)兩個(gè)數(shù)據(jù)表進(jìn)行合并,合并的方式為inner,此外還有l(wèi)eft、right和outer方式。使用ort_values函數(shù)和sort_index函數(shù)完成排序,使用where函數(shù)完成數(shù)據(jù)分組,使用split函數(shù)實(shí)現(xiàn)分列。
第四,數(shù)據(jù)提取
主要是使用三個(gè)函數(shù):loc、iloc和ix,其中l(wèi)oc函數(shù)按標(biāo)準(zhǔn)值進(jìn)行提取,iloc按位置進(jìn)行提取,ix可以同時(shí)按標(biāo)簽和位置進(jìn)行提取。除了按標(biāo)簽和位置提取數(shù)據(jù)意外,還可以按照具體的條件進(jìn)行提取。
第五,數(shù)據(jù)篩選匯總
Python中使用loc函數(shù)配合篩選條件來(lái)完成篩選功能,配合sum和count函數(shù)還能實(shí)現(xiàn)Excel中sumif和countif函數(shù)的功能。Python中使用的主要函數(shù)是groupby和pivot_table。
網(wǎng)站欄目:python分組函數(shù) python 分組
鏈接地址:http://chinadenli.net/article22/dodcicc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)