iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
1

嗨!今天是第十天了,沒想到自己竟然撐到1/3了,還記得我們在上一篇說明了索引的各種設定運用,接下來就來聊聊Groupby是什麼吧!

Splitting the data into groups based on some criteria
Applying a function to each group independently
Combining the results into a data structure

有使用SQL語法的話,對它應該不陌生,是根據要的某一項資料做分組方便查找,根據不同組別做資料處理的概念。
直接開始使用就知道啦!(let's go!)

The SQL GROUP BY Statement
The GROUP BY statement is often used with aggregate functions (COUNT, MAX, MIN, SUM, AVG) to group the result-set by one or more columns.

import pandas as pd
fortune = pd.read_csv("./csv/fortune1000.csv",index_col="Rank")

import pandas並且匯入資料,資料的index設定為"Rank"。(如圖)
Imgur

Groupby()

使用groupby()方法可以將資料依照自己要的column分組,我們用Sector的內容做分組的依據,並存到變數內:

sector = fortune.groupby("Sector")

Groupby type

fortune資料做groupby之後,可以來看看它的資料類型:

type(sector)

使用type可以看到資料類型:pandas.core.groupby.DataFrameGroupBy

Group size

我們可以用size()sector裡面每個組別內的大小:

sector.size()

輸出:

Sector
Aerospace & Defense              20
Apparel                          15
Business Services                51
Chemicals                        30
Energy                          122
Engineering & Construction       26
Financials                      139
Food and Drug Stores             15
Food, Beverages & Tobacco        43
Health Care                      75
Hotels, Resturants & Leisure     25
Household Products               28
Industrials                      46
Materials                        43
Media                            25
Motor Vehicles & Parts           24
Retailing                        80
Technology                      102
Telecommunications               15
Transportation                   36
Wholesalers                      40
dtype: int64

get_group()

知道如何建立group之後,就來看看怎麼依據取資料吧!

fortune = pd.read_csv("./csv/fortune1000.csv",index_col="Rank")
sectors = fortune.groupby("Sector")

一樣,先匯入資料,接著用get_group()這個方法:

sectors.get_group("Energy")

括弧內放入要取出的類別,這邊我們找"Energy"。(如圖)
Imgur

如果還不清楚的話,來寫一個簡單的例子吧!
我們先定義coldata內容:

col = ['class','name','hbd']
data = [['class0', 'user0', '1993-10-01'],
        ['class0', 'user1', '1992-10-02'],
        ['class1', 'user2', '1990-10-01'],
        ['class2', 'user3', '1983-10-03'],
        ['class1', 'user4', '1991-10-02'],
        ['class0', 'user5', '2001-10-03']]
frame = pd.DataFrame(data,columns=col)

上面可以看到總共有class0到2三個類別,我們要依據這項資料做分組:

frame_class = frame.groupby('class')

分組之後,可以用groups來看結果:

frame_class.groups

可以看到輸出:

{'class0': Int64Index([0, 1, 5], dtype='int64'),
 'class1': Int64Index([2, 4], dtype='int64'),
 'class2': Int64Index([3], dtype='int64')}

表示資料被分成class0,class1,class2,且顯示每個組有什麼資料與資料類型。

接著來使用get_group()取出class1:

frame_class.get_group("class1")

Groupby運算

講了這些,到底為何要做分組呢?
假設我們想知道不同族群的收入該怎麼做呢?其實分組後依然可以使用數學計算的方法:
一樣可以用sum():
定義一組資料集:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                      'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})

記得要匯入pandas&numpy

import pandas as pd
import numpy as np

Imgur
計算總和:

df.groupby('A').sum()

計算兩群組總和

df.groupby('A').sum()

Imgur

總結

今天說明了groupby的使用,上一篇我們說明了Index的使用,但是都只是單一索引(index),下一篇我將會介紹如何使用多層索引MultiIndex!敬請期待啦!

更多參考資料:
10 Minutes to pandas


上一篇
[Day09]Pandas索引的運用!
下一篇
[Day11]Pandas使用多層索引!
系列文
使用Python進行資料分析30

1 則留言

0
kyc1109
iT邦新手 5 級 ‧ 2019-08-06 01:16:17

請問下面這個應該是筆誤吧!

計算兩群組總和
df.groupby('A').sum()

我要留言

立即登入留言