1. 程式人生 > >Python資料處理——Pandas模組使用(七)

Python資料處理——Pandas模組使用(七)

本文主要介紹Pandas統計函式:groupby、pivot_table及crosstab

產生資料

import numpy as np
import pandas as pd
from pandas import DataFrame

df = DataFrame({'key1':['a','a','b','b','a'],
                'key2':['one','two','one','two','one'],
                'data1':[1,2,3,2,5],
                'data2':np.random.randn(5
)}) print(df) # data1 data2 key1 key2 # 0 1 0.493919 a one # 1 2 -0.887280 a two # 2 3 -0.267727 b one # 3 2 0.048972 b two # 4 5 0.309441 a one
分組groupby

Pandas中最為常用和有效的分組函式。

  • 按列分組
    注意以下使用groupby()函式生成的group1是一箇中間分組變數,為GroupBy型別。既可依據單個列名’key1’進行為分組,也可依據多個列名[‘key1’,’key2’]進x行分組。根據for迴圈遍歷元素。
# 根據單個列分組
group1 = df.groupby('key1')
print(group1)
# <pandas.core.groupby.DataFrameGroupBy object at 0x0000015036489710>

# 根據多個列分組
group2 = df.groupby(['key1','key2'])
print(group2)
# <pandas.core.groupby.DataFrameGroupBy object at 0x000001503636C080>

# 遍歷group1中的元素
l=[x for x in group1]
print(l)
# [('a',    data1     data2 key1 key2
# 0 1 0.493919 a one # 1 2 -0.887280 a two # 4 5 0.309441 a one), # ('b', data1 data2 key1 key2 # 2 3 -0.267727 b one # 3 2 0.048972 b two)]
  • 按分組統計
    在分組group1、group2上應用size()、sum()、count()等統計函式,能分別統計分組數量、不同列的分組和、不同列的分組數量。
# 呼叫聚合函式打印出每個組中結果
print(group1.size())
# key1
# a    3
# b    2
# dtype: int64

print(group1.sum() )
#       data1     data2
# key1                 
# a         8 -0.083919
# b         5 -0.218755

print(group1.count())
#       data1  data2  key2
# key1                    
# a         3      3     3
# b         2      2     2
  • 應用agg()
    對於分組的某一列或者多個列,應用agg(func)可以對分組後的資料應用func函式。例如:用group1[‘data1’].agg(‘mean’)對分組後的’data1’列求均值。當然也可以推廣到同時作用於多個列和使用多個函式上。
print(group1['data1'].agg('mean'))
# key1
# a    2.666667
# b    2.500000
# Name: data1, dtype: float64

print(group1['data1'].agg(['mean','sum']))
#           mean  sum
# key1
# a     2.666667    8
# b     2.500000    5

print(group1['data1','data2'].agg(['mean','sum']))
#          data1         data2
#           mean sum      mean       sum
# key1
# a     2.666667   8 -0.556335 -1.669005
# b     2.500000   5  0.052789  0.105577
  • 應用apply()
    apply()不同於agg()的地方在於:前者應用於dataframe的各個列,後者僅作用於指定的列。
print(df.groupby('key1').apply(np.mean))
#          data1     data2
# key1                    
# a     2.666667  0.083070
# b     2.500000 -0.346864

print(df.groupby(['key1','key2']).apply(np.mean))
#            data1     data2
# key1 key2
# a    one     3.0  0.556917
#      two     2.0 -0.864626
# b    one     3.0  0.723882
#      two     2.0 -1.417610
透視表pivot_table

可以產生類似於excel資料透視表的結果,相當的直觀。

  • 分組統計
    其中引數index指定“行”鍵,columns指定“列”鍵。
print(pd.pivot_table(df, index='key1', columns='key2'))
#      data1         data2          
# key2   one two       one       two
# key1                              
# a        3   2  0.246833  1.018249
# b        3   2 -0.508228  1.298586

print(df.pivot_table(['data1'], index='key1',columns='key2'))
#      data1
# key2   one two
# key1
# a        3   2
# b        3   2
  • 分項彙總
    如果將引數margins設定為True,則可以得到分項總計資料。
print(df.pivot_table(index='key1',columns='key2', margins=True))
#      data1                    data2
# key2   one  two       All       one       two       All
# key1
# a      3.0  2.0  2.666667  0.246833  1.018249  0.503971
# b      3.0  2.0  2.500000 -0.508228  1.298586  0.395179
# All    3.0  2.0  2.600000 -0.004854  1.158417  0.460454

交叉表crosstab

可以按照指定的行和列統計分組頻數,用起來非常方便;當然同樣的功能也可採用groupby實現。

print(pd.crosstab(df.key1,df.key2, margins=True))
# key2  one  two  All
# key1
# a       2    1    3
# b       1    1    2
# All     3    2    5

相關推薦

Python資料處理——Pandas模組使用

本文主要介紹Pandas統計函式:groupby、pivot_table及crosstab 產生資料 import numpy as np import pandas as pd from pandas import DataFrame df = Da

Python資料處理——Pandas模組使用

本文主要介紹pandas資料清洗,排序,索引設定,資料選取 資料清洗 更改資料格式astype() isin #計算一個“Series各值是否包含傳入的

Python資料分析學習筆記1numpy模組基礎入門

        numpy模組可以進行高效的資料處理,並提供了陣列的支援,很多模組都依賴他,比如pandas、scipy、matplotlib等,因此這個模組是基礎。 (1)匯入: import numpy (2)建立一維和二維陣列: #建立一維陣列 x=numpy.

Python海量資料處理之_Hadoop概念和原理

1. 說明  Hadoop是個分散式的架構,它將海量資料處理工作分配到叢集中的多個機器上執行。前篇介紹了Hadoop的安裝,在安裝過程中會產生一些疑問,比如NameNode是什麼東西?本篇就以問題&解答的方式介紹Hadoop的相關概念及其原理。 2. NameNode,DataNode,以及Seco

最全總結 | 聊聊 Python 資料處理全家桶Mysql 篇

![image](https://upload-images.jianshu.io/upload_images/1466987-82ad628a151414ab?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 1\. 前言 在爬蟲、自動化、資料

最全總結 | 聊聊 Python 資料處理全家桶Memcached篇

![image](https://upload-images.jianshu.io/upload_images/1466987-40e7d815377e744f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 1\. 前言 本篇文章繼續繼續另外

最全總結 | 聊聊 Python 資料處理全家桶配置篇

![image](https://upload-images.jianshu.io/upload_images/1466987-12159a5ab2a559d8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 1.前言 在實際專案中,經常會接觸

運維學python之爬蟲中級篇Sqlite3

pro odin any /dev/ 裏的 連接 oracle postgresq pycharm 前文已經講過無數據庫版本操作(csv,json),今天我們要開始講有數據庫版本的操作,首先就是sqlite3。 1 介紹 SQLite是一個C庫,它提供了一個輕量級的基於磁盤

Python 二級模擬操作題

right ali ima 輸出 import 單詞 com true 二級 1. 從鍵盤輸入 3 個數作為三角形的邊長,在屏幕上顯示輸出由這 3 個邊長構成三角形的面積(保留 2 位小數) 代碼: a,b,c = eval(input()) p = (a+b+c

python中的時間模組time

可以從原始碼中看到time有如下的方法: Functions: time() -- return current time in seconds since the Epoch as a float clock() -- return CPU time since process start

python資料結構與演算法1

資料結構與演算法(Python) Why?我們舉⼀個可能不太恰當的例⼦:如果將開發程式的過程⽐喻為作戰,我們碼農便是指揮作戰的將軍,⽽我們 所寫的程式碼便是⼠兵和武器。那麼資料結構和演算法是什麼?答⽈:兵法!我們可以不看兵法在戰場上⾁搏,如此,可能會勝利,可能會失敗。即使勝 利,可能也會付出巨⼤的代價。我們寫

python資料結構與演算法6

Python中的順序表Python中的list和tuple兩種型別採⽤了順序表的實現技術,具有前⾯討論的順 序表的所有性質。tuple是不可變型別,即不變的順序表,因此不⽀持改變其內部狀態的任何操 作,⽽其他⽅⾯,則與list的性質類似。list的基本實現技術Python標準型別list就是⼀種元素個數可變的

python資料結構與演算法10

棧棧(stack),有些地⽅稱為堆疊,是⼀種容器,可存⼊資料元素、訪問元 素、刪除元素,它的特點在於只能允許在容器的⼀端(稱為棧頂端指標,英 語:top)進⾏加⼊資料(英語:push)和輸出資料(英語:pop)的運算。 沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存⼊的 那個元素,確定了⼀種預

python資料結構與演算法9

指定位置插⼊節點 def insert(self, pos, item): """在指定位置新增節點""" if pos <= 0:

python資料結構與演算法8

連結串列與順序表的對⽐連結串列失去了順序表隨機讀取的優點,同時連結串列由於增加了結點的指標域,空 間開銷⽐較⼤,但對儲存空間的使⽤要相對靈活。連結串列與順序表的各種操作複雜度如下所示:注意雖然表⾯看起來複雜度都是 O(n),但是連結串列和順序表在插⼊和刪除時進 ⾏的是完全不同的操作。連結串列的主要耗時操作是遍

python資料結構與演算法7

單鏈表的操作is_empty() 連結串列是否為空 length() 連結串列⻓度 travel() 遍歷整個連結串列add(item) 連結串列頭部新增元素 append(item) 連結串列尾部新增元素 insert(pos, item) 指定位置新增元素 remove(item) 刪除節點 search

python資料結構與演算法11

佇列佇列(queue)是隻允許在⼀端進⾏插⼊操作,⽽在另⼀端進⾏刪除操作的 線性表。佇列是⼀種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插⼊ 的⼀端為隊尾,允許刪除的⼀端為隊頭。佇列不允許在中間部位進⾏操作! 假設佇列是q=(a1,a2,……,an),那麼a1就是隊頭元素,

python資料結構與演算法12

排序與搜尋排序演算法(英語:Sorting algorithm)是⼀種能將⼀串資料依照特定順序進⾏ 排列的⼀種演算法。排序演算法的穩定性穩定性:穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如 果⼀個排序演算法是穩定的,當有兩個相等鍵值的紀錄R和S,且在原本的列表 中R出現在S之前,在排序過的列表

python資料結構與演算法13

選擇排序選擇排序(Selection sort)是⼀種簡單直觀的排序演算法。它的⼯作原理如 下。⾸先在未排序序列中找到最⼩(⼤)元素,存放到排序序列的起始位 置,然後,再從剩餘未排序元素中繼續尋找最⼩(⼤)元素,然後放到已排 序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與資料移動有關。如

python資料結構與演算法15

選擇排序選擇排序(Selection sort)是⼀種簡單直觀的排序演算法。它的⼯作原理如 下。⾸先在未排序序列中找到最⼩(⼤)元素,存放到排序序列的起始位 置,然後,再從剩餘未排序元素中繼續尋找最⼩(⼤)元素,然後放到已排 序序列的末尾。以此類推,直到所有元素均排序完畢。選擇排序的主要優點與資料移動有關。如