Python之數據拆分——groupby()方法

文章目錄

  • groupby()方法
    • 通過列名進行分組
    • 通過Series對象進行分組
      • Series對象與原數據的行索引長度相等
      • Series對象與原數據的行索引長度不等
    • 通過字典進行分組
      • 按照columns軸的方向進行分組
      • 按照index軸的方向進行分組
    • 通過函數進行分組


groupby()方法

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

部分參數表示的含義如下:

  1. by:用于確定進行分組的依據
  2. axis:表示分組軸的方向,可以為0或1,默認為0
  3. level:如果某個軸是一個MultiIndex對象(索引層次結構),則會按特定級別或多個級別分組
  4. as_index:表示聚合后的數據是否以組標簽作為索引的DataFrame對象輸出,接受布爾值,默認為True
  5. sort:表示是否對分組標簽進行排序,接受布爾值,默認為True

通過groupby()方法執行分組操作,會返回一個GroupBy對象,該對象實際上并沒有進行任何計算,只是包含一些而關于分組鍵的中間數據而已。

一般,使用Series調用groupby()方法返回的是SeriesGroupBy對象,而使用DataFrame調用groupby()方法返回的是DataFrameBy對象。



在進行分組時,通過指定by參數來確定分組標準,常用的分組方式主要有四種:

  • 列表或數組,其長度必須與待分組的軸一樣
  • DataFrame對象中某列的名稱
  • 字典或Series對象,給出待分組軸上的值與分組名稱之間的對應關系
  • 函數,用于處理軸索引或索引中的各個標簽

通過列名進行分組

代碼:

import numpy as np
import pandas as pddf = pd.DataFrame({"key": ['C', 'B', 'C', 'A', 'B', 'B', 'A', 'C', 'A'],"Data": [2, 4, 6, 8, 10, 1, 14, 16, 18]})
print(df)
group_obj = df.groupby(by='key')
print("df.groupby(by='key'):\n", group_obj)

輸出結果:

  key  Data
0   C     2
1   B     4
2   C     6
3   A     8
4   B    10
5   B     1
6   A    14
7   C    16
8   A    18
df.groupby(by='key'):<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002018919F2B0>

從輸出結果可以看出,DataFrame經過分組之后得到了一個DataFrameGroupBy對象,該對象是一個可迭代的對象,即只有在真正需要的時候才會執行計算(惰性計算)

如果要查看每個分組的具體內容,應該使用for循環遍歷DataFrameGroupBy對象。

代碼:

for i in group_obj:print(i)

輸出結果:

('A',   key  Data
3   A     8
6   A    14
8   A    18)
('B',   key  Data
1   B     4
4   B    10
5   B     1)
('C',   key  Data
0   C     2
2   C     6
7   C    16)

通過Series對象進行分組

Series對象與原數據的行索引長度相等

將Series對象傳給by參數,作為分組鍵拆分DataFrame對象

代碼:

df1 = pd.DataFrame({'key1': ['A', 'A', 'B', 'B', 'A'],'kye2': ['one', 'two', 'one', 'two', 'one'],'data1': [2, 3, 4, 6, 8],'data2': [3, 5, 6, 3, 7]})
print(df1)se = pd.Series(['a', 'b', 'c', 'a', 'b'])
group_obj1 = df1.groupby(by=se)
for i in group_obj1:print(i)

輸出結果:

key1 kye2  data1  data2
0    A  one      2      3
1    A  two      3      5
2    B  one      4      6
3    B  two      6      3
4    A  one      8      7('a',   key1 kye2  data1  data2
0    A  one      2      3
3    B  two      6      3)
('b',   key1 kye2  data1  data2
1    A  two      3      5
4    A  one      8      7)
('c',   key1 kye2  data1  data2
2    B  one      4      6)

從輸出結果可以看出,se將df1對象分成a,b,c三組,其中索引0和3對應的兩行為a組數據,索引1和4對應的兩行為b組數據,索引2對應的一行為c組數據。


Series對象與原數據的行索引長度不等

代碼:

se1 = pd.Series(['a', 'b', 'a'])
group_obj2 = df1.groupby(se1)
for i in group_obj2:print("group_obj2:\n", i)

輸出結果:

('a',   key1 kye2  data1  data2
0    A  one      2      3
2    B  one      4      6)
('b',   key1 kye2  data1  data2
1    A  two      3      5)

由于se1只有三行數據,所以它只需要對df對象的前三行數據進行分組,即第一行第三行分為一組,最后一行分為一組,而不會將全部的數據進行分組


通過字典進行分組

用字典對DataFrame進行分組時,需要確定軸的方向及字典中的映射關系,即字典中的鍵為列名,字典的值為自定義的分組名。


按照columns軸的方向進行分組

代碼:

df2 = DataFrame({'a': [1, 2, 4, 8, 3],'b': [9, 6, 3, 7, 5],'c': [2, 3, 4, 6, 8],'d': [3, 5, 6, 3, 7]})
mapping = {'a': '第一組', 'b': '第二組', 'c': '第三組', 'd': '第一組'}
print(df2)
by_columns = df2.groupby(by=mapping, axis=1)
print("by_columns:")
for i in by_columns:print(i)

輸出結果:

   a  b  c  d
0  1  9  2  3
1  2  6  3  5
2  4  3  4  6
3  8  7  6  3
4  3  5  8  7
by_columns:
('第一組',    a  d
0  1  3
1  2  5
2  4  6
3  8  3
4  3  7)
('第三組',    c
0  2
1  3
2  4
3  6
4  8)
('第二組',    b
0  9
1  6
2  3
3  7
4  5)

拆分df2時,將a列、d列數據映射到第一組;將b列映射到第二組,將d列數據映射到第三組。


按照index軸的方向進行分組

代碼

mapping1 = {0: '第一組', 1: '第二組', 2: '第三組', 3: '第二組', 4: '第一組'}
by_index = df2.groupby(mapping1, axis=0)
print("by_index:")
for i in by_index:print(i)

輸出結果:

by_index:
('第一組',    a  b  c  d
0  1  9  2  3
4  3  5  8  7)
('第三組',    a  b  c  d
2  4  3  4  6)
('第二組',    a  b  c  d
1  2  6  3  5
3  8  7  6  3)

拆分df2時,將0行、4行數據映射到第一組;將1行、3行映射到第二組,將2行數據映射到第三組。


通過函數進行分組

使用函數作為分組鍵會更加靈活,任何一個被當作分組鍵的函數都會在各個索引值上被調用一次,返回的值會被用作分組名稱。

代碼:

df2 = DataFrame({'a': [1, 2, 4, 8, 3],'b': [9, 6, 3, 7, 5],'c': [2, 3, 4, 6, 8],'d': [3, 5, 6, 3, 7]},index=['Bob', 'Alice', 'Job', 'Jack', 'Helen'])
group_obj3 = df2.groupby(by=len)
print("group_obj3")
for i in group_obj3:print(i)

輸出結果:

group_obj3
(3,      a  b  c  d
Bob  1  9  2  3
Job  4  3  4  6)
(4,       a  b  c  d
Jack  8  7  6  3)
(5,        a  b  c  d
Alice  2  6  3  5
Helen  3  5  8  7)

在調用groupby()方法時傳入了內置函數len(),表明len()函數會對行索引一列執行求長度的操作,以行索引名稱的長度進行分組,則長度相同的行索引名稱會分成一組。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

超硬核!小白讀了這篇文章,就能在算法圈混了

作為一只超級硬核的兔子&#xff0c;從來不給你說廢話&#xff0c;只有最有用的干貨&#xff01;這些神級算法送給你 目錄 第一節 1.1bogo排序 1.2位運算 1.3打擂臺 1.4morris遍歷 第二節 2.1睡眠排序 2.2會死的兔子 2.3矩陣快速冪 2.4摔手機/摔雞蛋 時空復雜度目錄 …

Python之數據聚合——aggregate()方法

文章目錄使用內置統計方法聚合數據面向列的聚合方法aggregate()方法對每一列數據應用同一個函數對某列數據應用不同的函數對不同列數據應用不同函數使用內置統計方法聚合數據 實現數據拆分成組并分別計算平均數的操作 代碼&#xff1a; import pandas as pd import numpy as…

超硬核十萬字!全網最全 數據結構 代碼,隨便秒殺老師/面試官,我說的

本文代碼實現基本按照《數據結構》課本目錄順序&#xff0c;外加大量的復雜算法實現&#xff0c;一篇文章足夠。能換你一個收藏了吧&#xff1f; 當然如果落下什么了歡迎大家評論指出 目錄 順序存儲線性表實現 單鏈表不帶頭標準c語言實現 單鏈表不帶頭壓縮c語言實現 約瑟…

Python之分組級運算——【transform()方法、apply()方法】

文章目錄數據轉換——transform()方法數據應用——apply()方法數據轉換——transform()方法 使用aggregate()方法進行聚合運算已經在上一篇博客中詳細闡述&#xff0c;我們知道aggregate()方法返回的數據集的形狀&#xff08;shape&#xff09;與被分組的數據集的形狀是不同的…

java限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中&#xff0c;出于安全性考慮&#xff0c;經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是&#xff1a; 1、在同一臺電腦上一次只允許有一個用戶登錄系統&#xff1b; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Matplotlib——繪制圖表

文章目錄通過figure()函數創建畫布通過subplot()函數創建單個子圖通過subplots()函數創建多個子圖通過add_subplot()方法添加和選中子圖添加各類標簽繪制常見圖表繪制直方圖——hist()函數繪制散點圖——scatter()函數繪制柱狀圖——bar()函數設定線條的相關參數本地保存圖片通…

限制在同一臺電腦上只允許有一個用戶登錄系統

在web應用系統中&#xff0c;出于安全性考慮&#xff0c;經常需要對同一客戶端登錄的用戶數量和一個客戶同時在多個客戶端登陸進行限制。 具體一點就是&#xff1a; 1、在同一臺電腦上一次只允許有一個用戶登錄系統&#xff1b; 2、一個用戶在同一時間只允許在一個客戶端登錄…

Seaborn——繪制統計圖形

文章目錄可視化數據的分布繪制單變量分布繪制雙變量分布繪制成對的雙變量分布用分類數據繪圖類別散點圖通過stripplot()函數畫散點圖swarmplot()函數類別內的數據分布繪制箱型圖繪制提琴圖類別內的統計估計繪制條形圖繪制點圖可視化數據的分布 繪制單變量分布 一般采用最簡單…

Bokeh——交互式可視化庫

文章目錄前言如何通過Plotting繪制圖形前言 Bokeh是一個專門針對Web瀏覽器使用的交互式可視化庫&#xff0c;這是與其他可視化庫相比最核心的區別。 如何通過Plotting繪制圖形 Plotting是以構建視覺符號為核心的接口&#xff0c;可以結合各種視覺元素&#xff08;例如&#x…

指針、引用以及const限定符、constexpr限定符

文章目錄復合類型引用概念與使用引用的定義注意指針概念聲明方式取地址符指針值空指針利用指針訪問對象賦值和指針void* 指針指向指針的指針指向指針的引用初始化所有指針有多重含義的某些符號const限定符概念const的引用指針和const頂層const和底層constconstexpr和常量表達式…

關鍵字typedef、關鍵字using、auto類型說明符和declytpe類型指示符

文章目錄類型別名概念關鍵字 typedef別名聲明 (alias declaration) using指針、常量和類型別名類型別名簡化多維數組指針auto類型說明符概念復合類型、常量和autodecltype類型指示符概念decltype和引用類型別名 概念 有兩種方法可用于定義類型別名。 關鍵字 typedef typede…

初始化、賦值、默認初始化、列表初始化、類內初始值、直接初始化與拷貝初始化

文章目錄初始化和賦值的區別什么是默認初始化&#xff1f;列表初始化列表初始化的使用場景不適合使用列表初始化的場景類內初始值混用string對象和C風格字符串數組與vector對象關于vector對象兩者間的初始化關系直接初始化與拷貝初始化初始化和賦值的區別 初始化的含義是創建變…

js動態增加,刪除td,tr,table,div

js實現的動態添加&#xff0c;刪除table內容&#xff1a; 截圖如下&#xff1a; 1. 2. 源代碼&#xff1a; main.css body {background-image: url(../images/qiantai/bg.png);font-family: arial;font-size: 12px;color: #d4d7da;text-align: center;background-repeat: r…

string類的相關知識及部分操作

文章目錄string對象的初始化string::size_type類型string對象的讀寫操作使用標準庫中的iostream使用getline讀取一整行string對象的比較操作string對象的相加操作兩個string對象相加字面值和string對象相加string對象的初始化 拷貝初始化(copy initialization)&#xff1a;使用…

數組的部分練習

3.27&#xff1a;假設txt_size是一個無參數的函數&#xff0c;它的返回值是int。請回答下列哪個定義是非法的&#xff1f;為什么&#xff1f; unsigned buf_size1024; &#xff08;a&#xff09;int ia[buf_size];  &#xff08;b&#xff09;int ia[4*7-14]; &#xff08…

關于范圍for語句的使用

文章目錄使用范圍for語句處理多維數組使用范圍for語句處理多維數組 舉個例子&#xff0c;使用范圍for語句輸出多維數組&#xff08;ia&#xff09;所有值&#xff1a; for (const auto &row : ia)for (auto col : row)cout << col << endl;本循環中并沒有任何…

vector的應用練習

文章目錄編寫一段程序&#xff0c;使用條件運算符從vector< int >中找出哪些元素的值是奇數&#xff0c;然后將奇數值翻倍。 #include <iostream> #include <ctime> #include <vector> using namespace std; typedef int int_array[4]; int main() {v…

sizeof運算符運算結果小匯

文章目錄sizeof運算符的結果部分地依賴于其作用的類型sizeof運算符的結果部分地依賴于其作用的類型 對char或者類型為char的表達式執行sizeof運算&#xff0c;結果得1對引用類型執行sizeof運算得到被引用對象所占空間的大小對指針執行sizeof運算得到指針本身所占空間的大小對解…

jQuery實現復選框的全選和反選:

jQuery實現復選框的全選和反選&#xff1a; 截圖如下&#xff1a; 代碼如下&#xff1a; index.jsp: <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath…

C語言隱式/顯式類型轉換 | C++四種強制類型轉換、類的隱式轉換、explicit

文章目錄C語言類型轉換隱式類型轉換顯式類型轉換C 強制類型轉換static_castreinterpret_castconst_castdynamic_cast類的隱式類型轉換概念只允許一步類類型轉換explicit 抑制構造函數定義地隱式轉換可以通過顯式轉換使用explicit構造函數C語言類型轉換 隱式類型轉換 編譯器在…