最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas分組函數(shù)groupby的用法詳解

 更新時(shí)間:2024年01月30日 09:59:54   作者:金戈鐡馬  
在數(shù)據(jù)分析時(shí),經(jīng)常需要將數(shù)據(jù)分成不同的群組,pandas中的groupby()函數(shù)可以完美地完成各種分組操作,本文就來(lái)介紹一下Pandas分組函數(shù)groupby的用法,感興趣的可以了解一下

在數(shù)據(jù)分析時(shí),經(jīng)常需要將數(shù)據(jù)分成不同的群組,pandas中的groupby()函數(shù)可以完美地完成各種分組操作。

分組是根據(jù)DataFrame/Series的某個(gè)字段值,將該字段的值相等的行/列分到同一組中,每一個(gè)小組是一個(gè)新的DataFrame或Series。

groupby()也可以按DataFrame中的多個(gè)字段分組,當(dāng)多個(gè)字段的值都相等時(shí)分到同一組。

groupby()經(jīng)常與批處理函數(shù)apply()、聚合函數(shù)agg()等配合使用,實(shí)現(xiàn)對(duì)數(shù)據(jù)的多元處理。

groupby用法和參數(shù)介紹

groupby(self, by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=no_default, observed=False, dropna=True):

  • by: 指定根據(jù)哪個(gè)/哪些字段分組,默認(rèn)值是None,按多個(gè)字段分組時(shí)傳入列表。by參數(shù)可以按位置參數(shù)的方式傳入。

  • axis: 設(shè)置按列分組還是按行分組,0或index表示按列分組,1或columns表示按行分組,默認(rèn)值為0。

  • level: 當(dāng)DataFrame的索引為多重索引時(shí),level參數(shù)指定用于分組的索引,可以傳入多重索引中索引的下標(biāo)(0,1...)或索引名,多個(gè)用列表傳入。

level參數(shù)不能與by參數(shù)同時(shí)使用,如果兩者同時(shí)存在,當(dāng)by參數(shù)傳入的是多重索引中的索引,則level不生效,當(dāng)by參數(shù)傳入的是DataFrame的列名,則報(bào)錯(cuò)。

  • as_index: 分組結(jié)果默認(rèn)將分組列的值作為索引,如果按單列分組,結(jié)果默認(rèn)是單索引,如果按多列分組,結(jié)果默認(rèn)是多重索引。將as_index設(shè)置為False可以重置索引(0,1...)。

  • sort: 結(jié)果按分組列的值升序排列,將sort設(shè)置為False則不排序,可以提升性能。

  • dropna: 默認(rèn)情況下,分組列的NaN在分組結(jié)果中不保留,將dropna設(shè)置為False,可以保留NaN分組。

其他三個(gè)參數(shù)不用關(guān)注,group_keys參數(shù)在源碼中未使用,squeeze參數(shù)因?yàn)轭?lèi)型不兼容,官方已棄用,observed參數(shù)表示重設(shè)索引時(shí),保留創(chuàng)建的全NaN行。

分組對(duì)象的內(nèi)部結(jié)構(gòu)

# coding=utf-8
import pandas as pd
import numpy as np

vip_df = pd.DataFrame(
    {'isVip': ['vip', 'svip', 'member', 'vip', 'member', 'vip', 'svip'],
     'gender': ['male', 'female', 'female', 'female', 'male', 'female', 'male'],
     'age': [25, 30, 40, 25, 40, 18, 30],
     'vipLevel': ['LV2', 'LV5', np.nan, 'LV3', 'LV2', 'LV2', 'LV3'],
     'growValue': [180, 425, np.nan, 288, 190, 110, 240]}
)
print(vip_df)
grouped = vip_df.groupby('isVip')
print(grouped)

    isVip  gender  age vipLevel  growValue
0     vip    male   25      LV2      180.0
1    svip  female   30      LV5      425.0
2  member  female   40      NaN        NaN
3     vip  female   25      LV3      288.0
4  member    male   40      LV2      190.0
5     vip  female   18      LV2      110.0
6    svip    male   30      LV3      240.0
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C3E81D1370>

groupby()分組得到的是一個(gè)DataFrameGroupBy對(duì)象,直接打印DataFrameGroupBy對(duì)象只能看到它的內(nèi)存地址,看不到內(nèi)部的結(jié)構(gòu)。

for name, group in grouped:
    print(name)
    print(group)

 member
    isVip  gender  age vipLevel  growValue
2  member  female   40      NaN        NaN
4  member    male   40      LV2      190.0
svip
  isVip  gender  age vipLevel  growValue
1  svip  female   30      LV5      425.0
6  svip    male   30      LV3      240.0
vip
  isVip  gender  age vipLevel  growValue
0   vip    male   25      LV2      180.0
3   vip  female   25      LV3      288.0
5   vip  female   18      LV2      110.0

for group in grouped:
    print(group)
    print(type(group), type(group[0]), type(group[1]))

('member',     isVip  gender  age vipLevel  growValue
2  member  female   40      NaN        NaN
4  member    male   40      LV2      190.0)
<class 'tuple'> <class 'str'> <class 'pandas.core.frame.DataFrame'>
('svip',   isVip  gender  age vipLevel  growValue
1  svip  female   30      LV5      425.0
6  svip    male   30      LV3      240.0)
<class 'tuple'> <class 'str'> <class 'pandas.core.frame.DataFrame'>
('vip',   isVip  gender  age vipLevel  growValue
0   vip    male   25      LV2      180.0
3   vip  female   25      LV3      288.0
5   vip  female   18      LV2      110.0)
<class 'tuple'> <class 'str'> <class 'pandas.core.frame.DataFrame'>

DataFrameGroupBy是一個(gè)可迭代對(duì)象,可以轉(zhuǎn)換成list打印,也可以直接遍歷打印出來(lái)。遍歷出來(lái)的是一個(gè)個(gè)元組,每個(gè)元組對(duì)應(yīng)一個(gè)分組,元組的第一個(gè)元素與分組列里的值對(duì)應(yīng),元組的第二個(gè)元素是分到當(dāng)前小組的數(shù)據(jù),是一個(gè)DataFrame。

DataFrameGroupBy對(duì)象的內(nèi)部結(jié)構(gòu)為:[(分組名1, 子DataFrame1), (分組名2, 子DataFrame2), ...],相當(dāng)于groupby()將DataFrame按字段值分成了多個(gè)小的DataFrame,然后將字段值和小的DataFrame用元組的方式保存在DataFrameGroupBy對(duì)象中。

print(grouped.groups)
group_name = [gn for gn in grouped.groups.keys()]
print(group_name)
group = grouped.get_group(group_name[2])
print('-'*40, '\n', group, sep='')

{'member': [2, 4], 'svip': [1, 6], 'vip': [0, 3, 5]}
['member', 'svip', 'vip']
----------------------------------------
  isVip  gender  age vipLevel  growValue
0   vip    male   25      LV2      180.0
3   vip  female   25      LV3      288.0
5   vip  female   18      LV2      110.0

分組對(duì)象的groups屬性可以返回分組信息,結(jié)果是一個(gè)形似字典的對(duì)象,由分組名和此分組數(shù)據(jù)在原DataFrame中的行索引組成。

借用groups可以提取出所有分組的分組名,分組對(duì)象的get_group()方法可以返回指定分組名的子DataFrame。

按多重索引分組

vip_multi_df = vip_df.set_index(['isVip', 'gender'])
print('-'*40, '\n', vip_multi_df, sep='')

----------------------------------------
               age vipLevel  growValue
isVip  gender                         
vip    male     25      LV2      180.0
svip   female   30      LV5      425.0
member female   40      NaN        NaN
vip    female   25      LV3      288.0
member male     40      LV2      190.0
vip    female   18      LV2      110.0
svip   male     30      LV3      240.0

# 按多重索引中的指定索引進(jìn)行分組
grouped = vip_multi_df.groupby(level='isVip')
print('-'*40, '\n', grouped.mean(), sep='')
# 按多重索引中除指定索引之外的索引分組
grouped = vip_multi_df.groupby(level=vip_multi_df.index.names.difference(['gender']))
print('-'*40, '\n', grouped.mean(), sep='')
# 按多重索引中的多個(gè)索引分組
grouped = vip_multi_df.groupby(level=[0, 1])
print('-'*40, '\n', grouped.mean(), sep='')

----------------------------------------
              age   growValue
isVip                        
member  40.000000  190.000000
svip    30.000000  332.500000
vip     22.666667  192.666667
----------------------------------------
              age   growValue
isVip                        
member  40.000000  190.000000
svip    30.000000  332.500000
vip     22.666667  192.666667
----------------------------------------
                age  growValue
isVip  gender                 
member female  40.0        NaN
       male    40.0      190.0
svip   female  30.0      425.0
       male    30.0      240.0
vip    female  21.5      199.0
       male    25.0      180.0

level參數(shù)用于設(shè)置按多重索引中的指定索引分組,level傳入的方式可以是索引name,也可以是索引在多重索引中的下標(biāo),還可以是排除某個(gè)索引外的其他索引。指定多個(gè)時(shí)用列表的方式傳入。

grouped = vip_multi_df.groupby('gender')
print('-'*40, '\n', grouped.mean(), sep='')
grouped = vip_multi_df.groupby(['gender', 'age'])
print('-'*40, '\n', grouped.mean(), sep='')

----------------------------------------
              age   growValue
gender                       
female  28.250000  274.333333
male    31.666667  203.333333
----------------------------------------
            growValue
gender age           
female 18       110.0
       25       288.0
       30       425.0
       40         NaN
male   25       180.0
       30       240.0
       40       190.0

多重索引中的索引也可以傳給groupby()的by參數(shù),分組結(jié)果與將多重索引作為DataFrame的列是一樣的。

如果用DataFrame的列作為分組列,多重索引會(huì)被轉(zhuǎn)換成列保留在結(jié)果中。也可以用多重索引中的索引與列一起組合分組,相當(dāng)于先對(duì)DataFrame重設(shè)索引再分組。

重置結(jié)果的索引

grouped = vip_multi_df.groupby(['isVip', 'gender'])
print('-'*40, '\n', grouped.mean(), sep='')
# 重設(shè)索引
grouped = vip_multi_df.groupby(['isVip', 'gender'], as_index=False)
print('-'*40, '\n', grouped.mean(), sep='')

----------------------------------------
                age  growValue
isVip  gender                 
member female  40.0        NaN
       male    40.0      190.0
svip   female  30.0      425.0
       male    30.0      240.0
vip    female  21.5      199.0
       male    25.0      180.0
----------------------------------------
    age  growValue
0  40.0        NaN
1  40.0      190.0
2  30.0      425.0
3  30.0      240.0
4  21.5      199.0
5  25.0      180.0

分組結(jié)果的索引默認(rèn)是分組列的值,將as_index設(shè)置為False可以重置索引,相當(dāng)于先分組再調(diào)用reset_index()函數(shù)。

結(jié)果是否排序

grouped = vip_df.groupby('isVip')
print('-'*40, '\n', grouped.mean(), sep='')
grouped = vip_df.groupby('isVip', sort=False)
print('-'*40, '\n', grouped.mean(), sep='')

----------------------------------------
              age   growValue
isVip                        
member  40.000000  190.000000
svip    30.000000  332.500000
vip     22.666667  192.666667
----------------------------------------
              age   growValue
isVip                        
vip     22.666667  192.666667
svip    30.000000  332.500000
member  40.000000  190.000000

groupby()默認(rèn)對(duì)結(jié)果按分組列的值升序排列,如果將sort參數(shù)修改為False,則不排序,保留原DataFrame中的順序,不排序可以提升性能。

是否保留空值

grouped = vip_df.groupby('vipLevel')
print('-'*40, '\n', grouped.mean(), sep='')
grouped = vip_df.groupby('vipLevel', dropna=False)
print('-'*40, '\n', grouped.mean(), sep='')

----------------------------------------
                age  growValue
vipLevel                      
LV2       27.666667      160.0
LV3       27.500000      264.0
LV5       30.000000      425.0
----------------------------------------
                age  growValue
vipLevel                      
LV2       27.666667      160.0
LV3       27.500000      264.0
LV5       30.000000      425.0
NaN       40.000000        NaN

當(dāng)分組列有空值(NaN)時(shí),默認(rèn)的分組結(jié)果中不保留NaN分組,將dropna參數(shù)修改為False,正常保留NaN分組。

提取分組結(jié)果的指定列

grouped = vip_df.groupby('isVip', dropna=False)
print('-'*40, '\n', grouped['gender'], sep='')
for name, group in grouped['gender']:
    print(name)
    print(group)

----------------------------------------
<pandas.core.groupby.generic.SeriesGroupBy object at 0x00000285CA1B0790>
member
2    female
4      male
Name: gender, dtype: object
svip
1    female
6      male
Name: gender, dtype: object
vip
0      male
3    female
5    female
Name: gender, dtype: object

從groupby()分組結(jié)果中取一列,得到的是一個(gè)SeriesGroupBy對(duì)象,直接打印SeriesGroupBy對(duì)象只能看到它的內(nèi)存地址,看不到內(nèi)部的結(jié)構(gòu)。

SeriesGroupBy的內(nèi)部結(jié)構(gòu)與DataFrameGroupBy相似,SeriesGroupBy對(duì)象的內(nèi)部結(jié)構(gòu)為:[(分組名1, 子Series1), (分組名2, 子Series2), ...],因此SeriesGroupBy也可以轉(zhuǎn)換成list打印,也可以遍歷取出每一個(gè)元素。

grouped = vip_df['gender'].groupby(vip_df['isVip'])
for name, group in grouped:
    print(name)
    print(group)

member
2    female
4      male
Name: gender, dtype: object
svip
1    female
6      male
Name: gender, dtype: object
vip
0      male
3    female
5    female
Name: gender, dtype: object

也可以先指定需要獲取的列,再按DataFrame的另一個(gè)列進(jìn)行分組,結(jié)果與先分組再獲取指定列相同。

以上就是pandas中g(shù)roupby()函數(shù)的用法介紹和分析,本文都是用DataFrame舉例,Series的用法相似,不重復(fù)了。

相關(guān)文章

  • 一文帶你掌握python中*星號(hào)的用法

    一文帶你掌握python中*星號(hào)的用法

    Python中的?*號(hào)是一個(gè)特殊的符號(hào),在其他編程語(yǔ)言中,它最廣為人知的用途就是作為乘法運(yùn)算的符號(hào),而在Python中,它的用途遠(yuǎn)不止如此,下面我們就來(lái)學(xué)習(xí)一下它的具體用法吧
    2023-10-10
  • Python獲取時(shí)間戳代碼實(shí)例

    Python獲取時(shí)間戳代碼實(shí)例

    這篇文章主要介紹了Python獲取時(shí)間戳代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Python生成隨機(jī)數(shù)組的方法小結(jié)

    Python生成隨機(jī)數(shù)組的方法小結(jié)

    這篇文章主要介紹了Python生成隨機(jī)數(shù)組的方法,結(jié)合實(shí)例形式總結(jié)分析了Python使用random模塊生成隨機(jī)數(shù)與數(shù)組操作相關(guān)技巧,需要的朋友可以參考下
    2017-04-04
  • 使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面的實(shí)現(xiàn)

    使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面的實(shí)現(xiàn)

    本文主要介紹了使用selenium模擬動(dòng)態(tài)登錄百度頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼

    使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼

    大家都知道下載大型文件時(shí)存在一個(gè)問(wèn)題,那就是內(nèi)存使用量迅速上升,可能會(huì)造成電腦卡死,所以我們需要換一個(gè)方式進(jìn)行下載,這篇文章主要介紹了使用python下載大型文件的方法顯示進(jìn)度條和下載時(shí)間,需要的朋友可以參考下
    2022-11-11
  • 使用url_helper簡(jiǎn)化Python中Django框架的url配置教程

    使用url_helper簡(jiǎn)化Python中Django框架的url配置教程

    這篇文章主要介紹了使用url_helper簡(jiǎn)化Python中Django框架的url配置教程,需要的朋友可以參考下
    2015-05-05
  • Python查找第n個(gè)子串的技巧分享

    Python查找第n個(gè)子串的技巧分享

    今天小編就為大家分享一篇Python查找第n個(gè)子串的技巧心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 4種方法教你利用Python發(fā)現(xiàn)數(shù)據(jù)的規(guī)律

    4種方法教你利用Python發(fā)現(xiàn)數(shù)據(jù)的規(guī)律

    發(fā)現(xiàn)數(shù)據(jù)的規(guī)律是數(shù)據(jù)分析和數(shù)據(jù)科學(xué)中非常重要的一個(gè)步驟。這篇文章主要給大家整理了4個(gè)可以發(fā)現(xiàn)數(shù)據(jù)規(guī)律的方法,希望對(duì)大家有所幫助
    2023-03-03
  • python打印直角三角形與等腰三角形實(shí)例代碼

    python打印直角三角形與等腰三角形實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于python打印直角三角形與等腰三角形的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

    python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解內(nèi)容,需要的朋友們可以參考下。
    2020-08-08

最新評(píng)論

库尔勒市| 依兰县| 平山县| 来凤县| 青河县| 宣汉县| 西和县| 社会| 桂林市| 昌都县| 喀喇沁旗| 北票市| 江北区| 平乐县| 九龙县| 天峻县| 勐海县| 梓潼县| 马龙县| 来安县| 龙泉市| 道真| 交口县| 噶尔县| 乐昌市| 石台县| 望都县| 贵州省| 广东省| 高平市| 慈利县| 道真| 八宿县| 东宁县| 大足县| 营山县| 沿河| 定日县| 奈曼旗| 黑水县| 尖扎县|