欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Pandas索引和選取數(shù)據(jù)方法詳解

 更新時(shí)間:2021年10月06日 14:13:26   投稿:wdc  
使用Pandas做數(shù)據(jù)分析的時(shí)候,用的最多的功能恐怕就是對(duì)于數(shù)據(jù)集的索引,選組數(shù)據(jù)子集。Pandas庫(kù)提供了很多非常實(shí)用的方法,了解并熟練使用這些方法而不是用for循環(huán)的方法將會(huì)事半功倍。在這一篇文章中,我們將著重介紹這些方法

我們將使用2019年全國(guó)新能源汽車的銷量數(shù)據(jù)作為演示數(shù)據(jù),數(shù)據(jù)保存在一個(gè)csv文件中,讀者可以在GitHub倉(cāng)庫(kù)下載到 https://github.com/pythonlibrary/practice-pandas-skills.git

本篇文章中會(huì)使用到兩個(gè)庫(kù)pandas 和 numpy,確保它們都正確的安裝,而工作環(huán)境則使用jupyter notebook,如果有需要學(xué)習(xí)如何搭建環(huán)境的,可以閱讀 數(shù)據(jù)科學(xué)家的一種工作環(huán)境 – virtualenv和Jupyter Notebook。

文章中用于演示的代碼也可以在前邊提到的GitHub倉(cāng)庫(kù)中找到對(duì)應(yīng)的notebook源文件,文件名為 index_select_data.ipynb

首先在notebook中導(dǎo)入pandas和numpy,按照常用習(xí)慣,pandas導(dǎo)入為pd,numpy導(dǎo)入為np

import pandas as pd
import numpy as np

1. 導(dǎo)入數(shù)據(jù)集

在這一節(jié)中,我們會(huì)將數(shù)據(jù)文件導(dǎo)入為pandas中的數(shù)據(jù)對(duì)象,同時(shí)針對(duì)這個(gè)數(shù)據(jù)對(duì)象,做一些基本的信息展示,方便我們理解我們將要工作的數(shù)據(jù)。

我們的原始數(shù)據(jù)文件為csv格式,因此可以快速的使用pandas提供的read_csv方法將csv文件導(dǎo)入為pandas的DataFrame,同時(shí)利用DataFrame對(duì)象的head方法查看前兩行數(shù)據(jù)的內(nèi)容。

df = pd.read_csv('NEV_sales.csv')
df.head(2)

head方法接收一個(gè)整數(shù)為參數(shù),代表,我們想要獲得的行數(shù),默認(rèn)為5行,這里我們獲得了2行,可以看出,數(shù)據(jù)的索引(index)是數(shù)字,列(column)里邊包含了品牌以及2019年從1月份到12月份的銷售量。

為了后邊演示,我們將利用df這個(gè)數(shù)據(jù)集再創(chuàng)建一個(gè)新的數(shù)據(jù)集名為df_brand_index,它跟df的區(qū)別是,它將使用品牌(brand)作為索引,列為2019年從1月份到12月份的銷售量。我們使用set_index方法來(lái)實(shí)現(xiàn)。這次,我們使用跟head方法相對(duì)應(yīng)的tail方法來(lái)查看df_brand_index和df的不同。

df_brand_index = df.set_index('brand')
df_brand_index.tail(2)

可以看出,輸出的第一列名稱brand相比其他列名稱向下移了一點(diǎn),它已經(jīng)變成了索引,跟原來(lái)的索引不同,它具有索引名,即brand,但是所支持的操作方法跟索引是一致的。

另外,在輸出中我們看到了兩個(gè)有趣的信息,一是,最后一行品牌為總計(jì),這表明我們的原始數(shù)據(jù)中最后一行是所有行的總計(jì),在真正的數(shù)據(jù)分析中,它肯定會(huì)對(duì)結(jié)果有不好的影響,因此可以排除掉,而本文側(cè)重于pandas的操作,因此它對(duì)我們沒(méi)影響,二是,奔馳品牌在2019年每個(gè)月的銷量都是NaN,NaN是pandas中的一個(gè)特殊值,代表缺失值,而在我們這個(gè)數(shù)據(jù)集中,其實(shí)也就是銷量為0。

接下來(lái)我們從3個(gè)方面簡(jiǎn)單的看看我們的數(shù)據(jù)。

首先是數(shù)據(jù)量,我們正在分析多大的量的數(shù)據(jù)呢,DataFrame的shape屬性會(huì)告訴我們數(shù)據(jù)有多少行,多少列。通過(guò)下述代碼獲取到df_brand_index和df的形狀。

df_brand_index.shape, df.shape

對(duì)于df,總過(guò)有77行,15列,而df_brand_index有77行,14列因?yàn)槲覀儗⑵放屏修D(zhuǎn)換為了索引,所以少了一列。

然后是數(shù)據(jù)類型,我們的數(shù)據(jù)中是否有一些非法數(shù)據(jù)類型,我們分析的是新能源車銷量,因此,期望所有的數(shù)據(jù)都是數(shù)字,而非字符串或者其他,DataFrame的dtypes屬性會(huì)告訴我們這樣的信息。

df_brand_index.dtypes

沒(méi)問(wèn)題,所有的列都是數(shù)字(因?yàn)轭愋投际莊loat64),如果有任一列出現(xiàn)了 object字樣,那就是說(shuō)該列包含非數(shù)字的內(nèi)容。

最后是銷售量的基本信息,例如每個(gè)月的銷售量的最大,最小,平均值等等,使用DataFrame的describe()方法可以或者到這些信息。

df_brand_index.describe()

比如,2019年11月,新能源車在所有品牌的平均銷量為3831臺(tái),最大為72795臺(tái)(不合理,對(duì)吧?),為什么呢,記得我們前邊使用了tail方法看到數(shù)據(jù)的最后一行為總計(jì),因此這個(gè)最大值其實(shí)就是總計(jì)的值。

2. 列選擇

我們盡量避免使用列索引的稱呼,因?yàn)槿绻从⑽奈臋n的話,pandas并不使用column index來(lái)稱呼列,而是直接使用column,如果稱呼列索引的話恐怕會(huì)帶來(lái)歧義。

通過(guò)方括號(hào)[]可以從DataFrame獲取到某一列或者某幾列的數(shù)據(jù)。這里注意:如果我們獲取多列的數(shù)據(jù),則得到的仍然是一個(gè)DataFrame,而如果我們僅獲取一列數(shù)據(jù),將會(huì)得到一個(gè)Series(跟DataFrame同一等級(jí)的pandas對(duì)象,也是pandas中的另外一種常用的數(shù)據(jù)結(jié)構(gòu))

sr_brand_index = df_brand_index['2019-11']
sr_brand_index.head(2)

上邊,我們獲取了2019年11月的銷量數(shù)據(jù),查看內(nèi)容發(fā)現(xiàn),索引名稱還是為品牌,但是列沒(méi)有了名稱。

而下方,我們獲取了2019年11月和12月兩個(gè)月的銷量數(shù)據(jù),查看內(nèi)容發(fā)現(xiàn),不僅索引名稱在,同樣的DataFrame具有兩列,分別對(duì)應(yīng)兩個(gè)月的數(shù)據(jù)。

df_brand_index[['2019-12', '2019-11']].head(2)

3. 行選擇

這一節(jié),我們將按行來(lái)選擇數(shù)據(jù)。在pandas中最常用的,也是官方推薦的兩種進(jìn)行列選擇的方法為loc和iloc,兩者比較容易混淆,這里按照官方方法提供一個(gè)簡(jiǎn)單的快速記憶方法loc代表location,使用標(biāo)簽來(lái)定位, 而iloc中的i解讀為integer,即integer location通過(guò)數(shù)字來(lái)定位。什么意思呢?看下邊對(duì)比。

數(shù)字Index

首先我們使用df這個(gè)DataFrame,還記得吧,這個(gè)對(duì)象使用數(shù)字作為index,索引,我們來(lái)使用loc獲取index標(biāo)簽從0到4的行:

df.loc[0:4]

我們最終得到了5行內(nèi)容,而index為從0到4.

然后,我們來(lái)使用iloc獲取index從位置0到位置4的行:

df.iloc[0:4]

這里大家發(fā)現(xiàn)了區(qū)別,我們僅僅得到了4行,index為從0到3,為什么呢,iloc代表利用整數(shù)編號(hào)來(lái)獲取,其行為類似于python內(nèi)置數(shù)據(jù)結(jié)構(gòu)list的操作方法,獲取到的結(jié)果為[0,4)。

到這里,或許讀者已經(jīng)有點(diǎn)暈了,別著急,看過(guò)下邊這個(gè)例子以后,你就會(huì)恍然大悟,并明白為什么loc和iloc有時(shí)候很容易混淆。

字符串Index

我們?cè)僭赿f_brand_index上邊使用loc和iloc來(lái)看看效果,還記得吧df_brand_index中的Index是品牌名稱。

加入向上邊一樣,使用df_brand_index.loc[0:4]來(lái)獲取前5行,那么我們會(huì)得到一個(gè)異常

為什么呢?因?yàn)閘oc是使用標(biāo)簽來(lái)做選擇,而這個(gè)數(shù)據(jù)集的Index標(biāo)簽為字符串而不是數(shù)字,正確的用法為:

df_brand_index.loc['北京':'寶駿']

然后iloc的用法就很容易理解并且顯而易見(jiàn)了。

df_brand_index.iloc[0:4]

4. 行+列選擇,找到元素

避免混淆,我們將繼續(xù)使用df_brand_index來(lái)做演示。假如說(shuō)現(xiàn)在我們想找到某北汽品牌在2019年11月的銷量,或者前5個(gè)品牌在2019年10月到12月的銷量,我們就需要結(jié)合行列來(lái)一起進(jìn)行選擇,pandas會(huì)智能的根據(jù)找到的元素的形狀返回相應(yīng)的數(shù)據(jù)類型,例如:

獲取北汽2019年11月的銷量

df_brand_index.loc['北京', '2019-11']

如果使用iloc方法,下邊的方法可已得到等價(jià)的結(jié)果

df_brand_index.iloc[0, 1] # 1st column is 2019-11 in df_brand_index

獲取前5個(gè)品牌從2019年10月到12月的銷量

df_brand_index.loc['北京':'寶駿', '2019-12':'2019-10']

類似的使用iloc方法,下邊的方法也可以得到等價(jià)的結(jié)果

df_brand_index.iloc[0:5, 0:3]

5. 條件選擇

另外一個(gè)常用的數(shù)據(jù)選擇篩選辦法是根據(jù)元素的內(nèi)容,比如,我們想獲取到2019年11月和12月銷量均大于3000臺(tái)的品牌數(shù)據(jù)。

df_brand_index[(df_brand_index['2019-12'] > 3000) & (df_brand_index['2019-11'] > 3000)]

這里,我們使用了pandas的布爾選擇功能,即在[]中提供一個(gè)布爾條件,(df_brand_index[‘2019-12'] > 3000) & (df_brand_index[‘2019-11'] > 3000)代表,11月和12月銷量均大于3000,只得特別注意的是,條件中的括號(hào)非常重要,是一定需要使用的,否則,pandas將拋出異常。

6. 查找元素位置

最后,在實(shí)際項(xiàng)目中還會(huì)有需要通過(guò)某一個(gè)元素的值來(lái)尋找它在數(shù)據(jù)中出現(xiàn)的位置,例如我們想知道2019年11月銷量為6046的品牌,或者我們想知道在整個(gè)DataFrame中銷量為6046的所有品牌和對(duì)應(yīng)的月份

在已知列中查找

如果我們想知道2019年11月銷量為6046的品牌,我們完全可以使用第五節(jié)中的條件選擇先選取到相應(yīng)的數(shù)據(jù),然后再使用DataFrame的index屬性得到其對(duì)應(yīng)的品牌。

df_brand_index[df_brand_index['2019-11']==6046].index

在整個(gè)DataFrame中查找

如果我們想知道在整個(gè)DataFrame中銷量為6046的所有品牌和對(duì)應(yīng)的月份,那么pandas提供的內(nèi)建方法就無(wú)法滿足這個(gè)要求了,我們可以借助numpy來(lái)快速實(shí)現(xiàn)。

numpy提供了where方法,它可以返回滿足條件的元素在輸入的numpy arry的行列位置編號(hào),通過(guò)位置編號(hào)就可以在DataFrame中獲取到品牌。

DataFrame中有一個(gè)to_numpy方法,可以將DataFrame轉(zhuǎn)換為numpy array,將兩部分連起來(lái),就可以獲得index和column的編號(hào)。

idx = np.where(df_brand_index.to_numpy()==6046)[0][0]
col = np.where(df_brand_index.to_numpy()==6046)[1][0]
idx, col

上邊代碼會(huì)輸入(2,1)。其中2為index的編號(hào),1為column編號(hào),對(duì)應(yīng)于df_brand_index中為:

更多關(guān)于Pandas的相關(guān)文章請(qǐng)查看下面的相關(guān)文章

相關(guān)文章

  • 淺談Python 遞歸算法指歸

    淺談Python 遞歸算法指歸

    這篇文章主要介紹了淺談Python 遞歸算法指歸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python計(jì)算N天之后日期的方法

    python計(jì)算N天之后日期的方法

    這篇文章主要介紹了python計(jì)算N天之后日期的方法,涉及Python操作日期的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Python?Httpx庫(kù)實(shí)現(xiàn)超跑式網(wǎng)絡(luò)請(qǐng)求用法實(shí)例

    Python?Httpx庫(kù)實(shí)現(xiàn)超跑式網(wǎng)絡(luò)請(qǐng)求用法實(shí)例

    這篇文章主要為大家介紹了Python?Httpx庫(kù)實(shí)現(xiàn)超跑式網(wǎng)絡(luò)請(qǐng)求用法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python利用wxPython模塊打造ChatGPT式打字效果程序

    Python利用wxPython模塊打造ChatGPT式打字效果程序

    這篇文章主要為大家介紹了如何利用Python和wxPython模塊打造一個(gè)ChatGPT式打字效果程序,從而增強(qiáng)用戶體驗(yàn)或提高應(yīng)用程序的可讀性,感興趣的可以了解一下
    2023-05-05
  • 深入講解Java編程中類的生命周期

    深入講解Java編程中類的生命周期

    這篇文章主要介紹了深入講解Java編程中類的生命周期,在帶有垃圾回收功能的Java虛擬機(jī)上運(yùn)行的程序中類的生命周期就顯得格外重要,需要的朋友可以參考下
    2016-02-02
  • Pytorch實(shí)現(xiàn)LSTM和GRU示例

    Pytorch實(shí)現(xiàn)LSTM和GRU示例

    今天小編就為大家分享一篇Pytorch實(shí)現(xiàn)LSTM和GRU示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • pycharm使用matplotlib.pyplot不顯示圖形的解決方法

    pycharm使用matplotlib.pyplot不顯示圖形的解決方法

    今天小編就為大家分享一篇pycharm使用matplotlib.pyplot不顯示圖形的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python?seaborn數(shù)據(jù)可視化繪圖(直方圖,密度圖,散點(diǎn)圖)

    Python?seaborn數(shù)據(jù)可視化繪圖(直方圖,密度圖,散點(diǎn)圖)

    這篇文章主要介紹了Python?seaborn數(shù)據(jù)可視化繪圖(直方圖,密度圖,散點(diǎn)圖),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python?Matplotlib通過(guò)plt.subplots創(chuàng)建子繪圖

    Python?Matplotlib通過(guò)plt.subplots創(chuàng)建子繪圖

    這篇文章主要介紹了Python?Matplotlib通過(guò)plt.subplots創(chuàng)建子繪圖,plt.subplots調(diào)用后將會(huì)產(chǎn)生一個(gè)圖表和默認(rèn)網(wǎng)格,與此同時(shí)提供一個(gè)合理的控制策略布局子繪圖,更多相關(guān)需要的朋友可以參考下面文章內(nèi)容
    2022-07-07
  • python中reshape函數(shù)用法示例詳解

    python中reshape函數(shù)用法示例詳解

    reshape函數(shù)是Numpy庫(kù)中的一個(gè)函數(shù),可以用于改變一個(gè)數(shù)組的形狀,例如將一個(gè)二維數(shù)組轉(zhuǎn)換成一個(gè)三維數(shù)組,這篇文章主要介紹了python中reshape函數(shù)用法詳解,需要的朋友可以參考下
    2023-09-09

最新評(píng)論