pandas與numpy中神奇的axis

2021-01-14 SSSimon Yang
pandas與numpy中神奇的axis

最近在百奧智匯兼職,基本上比較重的工作就在數據處理,所以pandas和numpy用的比較多。

不知不覺中,pandas各種函數越用越熟練,但是總要靠結果來推算到底應該指定axis=0還是1,你有沒有這種經歷呢?

經過摸索,我找到了一種axis利於記憶也好解釋的理論。下面一起來看看吧!

核心內容

axis是你要操作的軸。

pandas

導入包,創建一個3X4的dataframe。

import pandas as pdimport numpy as npdata = pd.DataFrame(np.random.randn(4,3))

out:

0   -0.4292781    0.4159852    1.5554183    3.364704dtype: float64

axis=1,說明我們要對第二個軸進行操作。

操作中處理的是第二個軸一共3個值,3個值被消滅了,被1個和值取代,結果是長度為4的series。


out:


020-0.0026170.34558510.273499-0.38634522.6024320.28416931.5703471.656065

同樣對第二個軸進行操作。

處理的是第二個軸3個值,3個值被drop掉1列後變為2個值,結果是4X2的dataframe。


data_ = pd.DataFrame(np.random.randn(4,3))pd.concat([data,data_],axis=1)

out:


0120120-0.002617-0.7722460.345585-0.349359-0.033281-0.77437810.2734990.528832-0.386345-1.6307380.773259-0.95317722.602432-1.3311830.2841691.7144360.1155642.48048931.5703470.1382921.6560650.2291221.4896283.029022

處理的是第二個軸,data二軸3個值,拼接的data_二軸也為3個值,所以結果是4X6的dataframe。


data.sort_values([0],axis=1)

out:


1020-0.772246-0.0026170.34558510.5288320.273499-0.3863452-1.3311832.6024320.28416930.1382921.5703471.656065

處理的是第二個軸3個值,對第一個軸name為0對應的3個值進行排序,從小到大,結果是4X3的dataframe。

來個更複雜的

下面為常見的歸一化:

data.apply(lambda a:(a-np.min(a))/(np.max(a)-np.min(a)),axis=1)

out:


01200.6885020.01.00000010.7210011.00.00000021.0000000.00.41065330.9435240.01.000000

處理的是第二個軸3個值,對第一軸每一個name對應的三個值進行歸一化處理,結果是4X3的dataframe 。

強行輸出就會看的更清晰:

data.apply(lambda a:print(a),axis=1)

0   -0.0026171   -0.7722462    0.345585Name: 0, dtype: float640    0.2734991    0.5288322   -0.386345Name: 1, dtype: float640    2.6024321   -1.3311832    0.284169Name: 2, dtype: float640    1.5703471    0.1382922    1.656065Name: 3, dtype: float64

out:

0    None1    None2    None3    Nonedtype: object

lambda函數沒有指定返回值,所以默認返回None,結果是長度為4全為None的series。


apply函數可以實現非常多的自定義操作,也可以拿來自己實現sum, sort, drop等操作,每次輸入的都是n個值,返回1個值最後為series,返回n個值最後則為dataframe。

pandas中的axis是基於numpy的, 所以上面的概念在numpy中也適用。

numpy

其實numpy難的地方在於多維,下面來看一個三維的例子:

import numpy as npdata = np.arange(0, 24).reshape((2,3,4)) print(data.shape)data

out:

array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],
[[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])



rollaxis是軸滾動的意思,axis=n,將n軸移到0軸。

data = np.arange(0, 24).reshape((2,3,4))data = np.rollaxis(data,axis=2) print(data.shape)data

out:

array([[[ 0,  4,  8],        [12, 16, 20]],
[[ 1, 5, 9], [13, 17, 21]],
[[ 2, 6, 10], [14, 18, 22]],
[[ 3, 7, 11], [15, 19, 23]]])

將最後一個軸移到最前面,其實就是挨個取最後一層的4個值,組成第一層,內部就是2X3的矩陣。

data = np.arange(0, 24).reshape((2,3,4))data = np.rollaxis(data,axis=1) print(data.shape)data

out:

array([[[ 0,  1,  2,  3],        [12, 13, 14, 15]],
[[ 4, 5, 6, 7], [16, 17, 18, 19]],
[[ 8, 9, 10, 11], [20, 21, 22, 23]]])

將倒數第二個軸移到最前面,其實就是把最後一層4個值當成一個對象進行處理,挨個取第二層3個值,組成第一層,最後內部就是2X4的矩陣。


swapaxes是軸交換的意思,m, n,將m軸與n軸交換。

data = np.arange(0, 24).reshape((2,3,4))data = np.swapaxes(data,0,1)print(data.shape)data

out:

array([[[ 0,  1,  2,  3],        [12, 13, 14, 15]],
[[ 4, 5, 6, 7], [16, 17, 18, 19]],
[[ 8, 9, 10, 11], [20, 21, 22, 23]]])

結果為3,2,4,把最後一層4個值當成一個對象,實現的其實就是前面3, 2的轉置。

data = np.arange(0, 24).reshape((2,3,4))data = np.swapaxes(data,0,2)print(data.shape)data

out:

array([[[ 0, 12],        [ 4, 16],        [ 8, 20]],
[[ 1, 13], [ 5, 17], [ 9, 21]],
[[ 2, 14], [ 6, 18], [10, 22]],
[[ 3, 15], [ 7, 19], [11, 23]]])

結果為4,3,2,挨個取最後一層4個值,最後一層為第一層每次的2個值。


transpose 轉置

data = np.arange(0, 24).reshape((2,3,4))data = np.transpose(data,(1,2,0))print(data.shape)data

out:

array([[[ 0, 12],        [ 1, 13],        [ 2, 14],        [ 3, 15]],
[[ 4, 16], [ 5, 17], [ 6, 18], [ 7, 19]],
[[ 8, 20], [ 9, 21], [10, 22], [11, 23]]])

轉置,2,3,4經過1,2,0的取值後為3,4,2,第一層移到最後。


np.newaxis可以強行增加新軸。

data = np.arange(0, 24).reshape((2,3,4))data = data[:,np.newaxis,:,:]print(data.shape)data

out:

array([[[[ 0,  1,  2,  3],         [ 4,  5,  6,  7],         [ 8,  9, 10, 11]]],

[[[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]])

思考

遇到點有意思的結果,不如大家一起思考一下:

array = np.array([['hello world','sssimon yang']]) print(array.shape)

np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=0,arr=array)

out:

array([['hello', 'sssim']], dtype='<U5')

np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=1,arr=array)

out:

array([['hello', 'sssimon']], dtype='<U7')

為什麼兩次的結果會不一樣呢?歡迎在評論區給出你的答案。

感謝大家

原文使用jupyterlab,out為jupyterlab每個cell的默認輸出。謝謝大家!


相關焦點

  • 關於Numpy和Pandas axis的理解
    先知維度在理解axis之前,我們應該理解維度的含義:通常的理解是:「點是0維、直線是1維、平面是2維、體是3維」。在機器學習中我們常常處理幾十維的數據,對於機器學習常用的Numpy庫,當我們賦予二維數組每一行一個值的時候,那麼此時二維數組的列數就是多維空間的維度。
  • D03 Numpy排序、篩選、統計
    在生活中最為常見的數據存放形式是二維表,我們將二維表數據轉換為ndarray之後對應的即為二維數組,下面以二維數組為例,講述numpy的排序、篩選、統計。排序關於排序,numpy的開發者們一早就為我們準備好了方法函數供我們使用,並且提供了多種不同的排序算法例如最常用的quicksort以及穩定性最強的mergesort。
  • Numpy應用整理
    >numpy.arange(n)生成range數據,注意要區別於python中的range()函數,numpy中的arange()>>> nr = np.arange(1,10,2)>>> nrarray([1, 3, 5, 7, 9])
  • 為什麼要學Numpy,一文總結知識點
    還記得自己剛接觸Pandas、Sklearn、Tensorflow這幾個技術的時候,經常看到文檔和代碼中針對多維數組的創建、變形、乘法等操作,因為不了解這些知識導致難以理解進度緩慢
  • D02 Numpy常用函數,如何優雅的遍歷一個多維數組?
    reshapenumpy.reshape(arr, newshape, order=』C』)arr 是需要改變形狀的數組newshape 是新數組的維度屬性,新數組的維度屬性應與原數組兼容,例如行列相等order 是指定按行序或列序改變數組,』C』 — 按行,』F』 — 按列,』A』 — 原順序,』k』 — 元素在內存中的出現順序。其默認值為』C』。
  • Pandas的函數應用及映射方法
    運用的函數可以是numpy中的函數,也可以是匿名函數或自定義的函數。其語法及參數說明如下:語法:df.apply(['func', 'axis=0', 'broadcast=None', 'raw=False', 'reduce=None', 'result_type=None', 'args=()', 'kwds'],)**重要參數說明:· func:對對象操作的函數,可以是numpy中的函數,也可以是匿名函數或自定義的函數
  • Numpy入門詳細教程
    >numpy入門詳細教程python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • python數據分析包|Pandas&NumPy小抄(Cheat_Sheet)
    3、NumPy速查手冊二文本格式#Importing/exporting#numpy讀入及保存內容np.loadtxt('file.txt') | From a text file數組複製、排序、變形np.copy(arr) | Copies arr to new memoryarr.view(dtype) | Creates view of arr elements with type dtypearr.sort() | Sorts arrarr.sort(axis=0) | Sorts specific axis of arrtwo_d_arr.flatten
  • Pandas>>sample()函數 隨機選取若干行
    pandas中自帶有抽樣的方法。功能相似:numpy.random.choice函數名:DataFrame.sample(n=None,frac=None,replace=False,weights=None,random_state=None,axis=None)import pandas as pdimport numpy as npdata_test= pd.DataFrame
  • python數據科學系列:numpy入門詳細教程
    numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • NumPy中的ndarray與Pandas的Series和DataFrame之間的區別與轉換
    在數據分析中,經常涉及numpy中的ndarray對象與pandas的Series和DataFrame對象之間的轉換,讓一些開發者產生了困惑。本文將簡單介紹這三種數據類型,並以金融市場數據為例,給出相關對象之間轉換的具體示例。
  • Python模塊NumPy,Pandas,matplotlib的中文文檔
    今天比較忙所以不能寫長文了作為一名數據工程師需要熟練掌握python中的這些numpy,matplotlib,pandas,sklearn,seaborn,statsmodel.模塊但是由於這些模塊的文檔都是英文的可能一些英文不好的同學學起來會比較的困難,所以我從網上給大家找到一些中文的文檔
  • 在pandas中使用pipe()提升代碼可讀性
    而在以前我撰寫的一些文章中,為大家介紹過pandas中的eval()和query()這兩個幫助我們鏈式書寫代碼,搭建數據分析工作流的實用API,再加上下面要介紹的pipe(),我們就可以將任意pandas代碼完美組織成流水線形式。2.
  • 6個提升效率的pandas小技巧
    pandas是python中常用的數據分析庫,出現頻率非常高,而且pandas功能之多讓人咋舌,即使pandas老手也沒法保證能高效使用pandas做數據分析。這篇文章目的梳理幾個高效實用的pandas小技巧,供大家參考。1.
  • python時間序列分析之_用pandas中的rolling函數計算時間窗口數據
    上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    numpy的基本的東西我們學習差不多了,後面具體應用中遇到問題具體分析,然後去深入了解遇到的新的知識點就行。現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。
  • Numpy高級操作大全!!!
    這個函數接受下列參數:– numpy.swapaxes(arr, axis1, axis2)– 參數:• arr:要交換其軸的輸入數組• axis1:對應第一個軸的整數• axis2:對應第二個軸的整數import numpy as npa = np.arange(8).reshape
  • Python NumPy用法介紹
    使用下面格式約定,引入NumPy包:import numpy as npNumPy的ndarray:N維數組對象NumPy最重要的是其N維數組對象(即ndarray),其中的所有元素必須是相同類型的。從磁碟讀取數據創建ndarray數組,將ndarray數組保存到磁碟(大部分情況會使用pandas或其它工具加載文本或表格數據)np.load(fname)• fname : 文件名,以.npy為擴展名,壓縮擴展名為.npznp.save(fname, array) 或 np.savez(fname, array)• fname
  • Pandas的介紹與基本使用
    3、怎麼用Pandas安裝方法:pip install pandas引用方法:import pandas as pd3.1、SeriesSeries是一種類似於一維數組的對象,由一組數據和一組與之相關的數據標籤(索引)組成。在數據分析的過程中非常常用。
  • Python中的Numpy基礎20問
    1, -1],[ 2, 2, 2]])'''16、numpy中如何進行數值捨入操作?import numpy as np# 創建一個二維數組x1 = np.array([[1,2,3],[4,5,6]])# 直接向數組末尾添加元素,返回平鋪的一維數組np.append(x1,[7,8,9])'''輸出:array([1, 2, 3, 4, 5, 6, 7, 8, 9])'''# 沿軸 0 添加元素np.append(x1, [[7,8,9]],axis = 0)'''輸出:array