Pandas數(shù)據(jù)結(jié)構(gòu)詳細(xì)說(shuō)明及如何創(chuàng)建Series,DataFrame對(duì)象方法
在網(wǎng)絡(luò)上的Pandas教程中,很多都提到了如何使用Pandas將已有的數(shù)據(jù)(如csv,如hdfs等)直接加載成Pandas數(shù)據(jù)對(duì)象,然后在其基礎(chǔ)上進(jìn)行數(shù)據(jù)分析操作,但是,很多時(shí)候,我們需要自己創(chuàng)建Pandas數(shù)據(jù)對(duì)象,并填入一些數(shù)據(jù),常見(jiàn)的應(yīng)用場(chǎng)景如:我們想要將現(xiàn)有的數(shù)據(jù)進(jìn)行處理,并生成一個(gè)新的Pandas數(shù)據(jù)對(duì)象,還有,我們想利用Pandas的數(shù)據(jù)保存功能(比如to_csv, to_json, to_hdf等等)把我們采集到的數(shù)據(jù)寫(xiě)入到IO里邊,因此掌握Pandas對(duì)象的特性,以及如何創(chuàng)建也是很重要的。
有些時(shí)候我們需要利用pandas數(shù)據(jù)結(jié)構(gòu)創(chuàng)建自己的對(duì)象,按自己的方式保存新數(shù)據(jù),我們將在本文中介紹如何實(shí)現(xiàn)。
1. Pandas的兩種數(shù)據(jù)類型
Pandas支持兩種數(shù)據(jù)類型,分別為Series和DataFrame,其中:
Series - 是一個(gè)帶有標(biāo)簽的一維數(shù)組,支持多種不同的類型,但是針對(duì)同一個(gè)Series里邊存儲(chǔ)的數(shù)據(jù)類型必須是一致的
DataFrame - 是一個(gè)帶有標(biāo)簽的二維數(shù)組,是一個(gè)尺寸可以修改的表格,一個(gè)DataFrame由多個(gè)Series組成,每一列都是一個(gè)Series
一句話描述的話就是,Series是很多標(biāo)量數(shù)據(jù)(Scalar)的集合,而DataFrame是很多Series的集合。
我們來(lái)看下圖這個(gè)例子,在1D的Series中,下圖中有三個(gè)Series,分別保存了姓名(name), 年齡(age)和得分(marks),而他們的每一行都分別對(duì)應(yīng)一個(gè)不同的人的信息,在每一個(gè)Series中的每一個(gè)單元格中(比如name series的第1行,對(duì)應(yīng)的Prasadi)都是一個(gè)標(biāo)量(Scalar),而每一行前邊的0,1,2,3這些就是數(shù)據(jù)的索引(index),也可以叫做標(biāo)簽,所以說(shuō),Series是帶有標(biāo)簽的一維數(shù)組。
可以看出,利用Series只能存儲(chǔ)一種類型的數(shù)據(jù),比如說(shuō)name series存儲(chǔ)的數(shù)據(jù)是字符串類型,而age series存儲(chǔ)的數(shù)據(jù)是整數(shù)型。如果我們想把name,age,marks存儲(chǔ)在一個(gè)數(shù)據(jù)結(jié)構(gòu)里,我們就需要使用DataFrame,從圖中看出,DataFrame類似于一個(gè)表格數(shù)據(jù),有行有列,行跟Series的行一致,是數(shù)據(jù)的標(biāo)簽,而每一列就是原來(lái)的每一個(gè)Series。
2. Series類型
如我們?cè)谇拔闹兴f(shuō),Series結(jié)構(gòu)中可以存儲(chǔ)任何類型的數(shù)據(jù),包括:整型,字符串類型,浮點(diǎn)型,甚至是Python對(duì)象等等,但是要求是,每一行的數(shù)據(jù)類型必須統(tǒng)一。那么如何創(chuàng)建一個(gè)Series對(duì)象呢,
通過(guò)numpy array
Pandas的一個(gè)主要用途是數(shù)據(jù)分析,而它也是基于Numpy實(shí)現(xiàn)的,因此,通過(guò)numpy array來(lái)創(chuàng)建Series是非常常見(jiàn)的。
np_array = np.random.randn(5) pd.Series(np_array, index=['a', 'b', 'c', 'd', 'e'])
上邊這段代碼,利用np.random.randn隨機(jī)生成一個(gè)長(zhǎng)度為5的numpy array,然后pd.Series使用這個(gè)numpy array來(lái)創(chuàng)建一個(gè)Series,在創(chuàng)建的同時(shí),指定了每一行的index(標(biāo)簽)分別是a,b,c,d,e,f,輸出結(jié)果為:
通過(guò)Python字典
通過(guò)上邊這個(gè)示例,大家有沒(méi)有發(fā)現(xiàn)Series跟Python內(nèi)置的dict類型是不是很類似,標(biāo)簽相當(dāng)于dict中的key,而數(shù)據(jù)內(nèi)容相當(dāng)于dict中的value,它們有一一對(duì)應(yīng)的關(guān)系,因此,可以想象,我們能夠直接通過(guò)Python的dict來(lái)創(chuàng)建一個(gè)Series。
d = {'b': 1, 'a': 0, 'c': 2} pd.Series(d)
上邊這段代碼,我們先創(chuàng)建了一個(gè)Python地點(diǎn)d,然后將這個(gè)字典傳遞給pd.Series來(lái)創(chuàng)建一個(gè)Pandas Series,運(yùn)行結(jié)果為:
通過(guò)標(biāo)量值(Scalar)
除了上邊這兩種方式,我們還可以通過(guò)一個(gè)簡(jiǎn)單的標(biāo)量值來(lái)創(chuàng)建Series,特別注意的是跟上邊兩種方式不同,在使用這種方式創(chuàng)建Series的時(shí)候,我們必須指定index
pd.Series(5, index=['a', 'b', 'c', 'd', 'e'])
如上邊代碼所示,我們使用一個(gè)常量5,然后指定index為a,b,c,d,e,同樣使用pd.Series可以創(chuàng)建一個(gè)Series對(duì)象,看到這里我們就能夠明白為什么必須指定Index了吧,那是因?yàn)镾eries對(duì)象是有長(zhǎng)度的,長(zhǎng)度是可以大于1的,而標(biāo)量的長(zhǎng)度固定為1,我們可以通過(guò)指定Index的方式來(lái)控制生成的Series的長(zhǎng)度,Series中的值則是重復(fù)使用這一個(gè)標(biāo)量常量5。其運(yùn)行結(jié)果為:
name屬性
當(dāng)我們創(chuàng)建一個(gè)Series的時(shí)候,我們可以指定一個(gè)名稱,這個(gè)名稱會(huì)被存儲(chǔ)到Series的name屬性中,后續(xù)我們還可以使用rename方法來(lái)修改這個(gè)屬性,例如下邊這樣的代碼:
s = pd.Series(np.random.randn(5), name='this_is_name') s
創(chuàng)建了一個(gè)名稱為this_is_name的Series,然后我們使用rename方法來(lái)重命名這個(gè)Series為this_is_new_name:
s = s.rename('this_is_new_name') s
上邊這兩部分代碼的輸入如下圖:
那么這個(gè)名稱有什么作用呢,這里預(yù)告一下,我們將在DataFrame中用到(別忘了DataFrame是多個(gè)Series的集合)
3. DataFrame類型
在第一節(jié)中我們介紹到,DataFrame是一個(gè)二維的表格數(shù)據(jù)結(jié)構(gòu),它有行和列的概念,跟行標(biāo)簽相對(duì)應(yīng)的,為了能夠按列索引數(shù)據(jù),每一列都可以有一個(gè)名稱,即列名,我們剛在Series章節(jié)中看到,Series可以表示一列數(shù)據(jù),我們?cè)诒竟?jié)中介紹的DataFrame就是多個(gè)這樣的Series的組合,每一列就對(duì)應(yīng)一個(gè)Series,而每一行也對(duì)應(yīng)一個(gè)Series。讀到這里,你是不是能夠猜的出我們剛說(shuō)的Series的name屬性的用途了,對(duì)了,使用Series創(chuàng)建DataFrame的列的時(shí)候,Series的名稱就會(huì)成為列名,如果Series作為行,則Series的名稱會(huì)成為行名。
接下來(lái)我們來(lái)講解如何創(chuàng)建DataFrame
通過(guò)一維numpy array或者Python List 組成的字典
大家可以想想,如果一個(gè)字典的value是array或者list的時(shí)候,那么這個(gè)字典其實(shí)就是一種表格結(jié)構(gòu),圖為DataFrame是一個(gè)表格結(jié)構(gòu)的數(shù)據(jù)類型,我們是可以通過(guò)這樣的字典來(lái)創(chuàng)建DataFrame,例如下邊這段代碼
d = {'one': [1., 2., 3., 4.], 'two': [4., 3., 2., 1.]} pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
我們把d這個(gè)Python字典傳遞給pd.DataFrame來(lái)創(chuàng)建新的DataFrame,同時(shí)我們可以通過(guò)指定index來(lái)指定DataFrame的行名(標(biāo)簽),上邊代碼的輸出為
通過(guò)包含列表的Python List
我們?cè)賮?lái)想想一下,除了字典之外可以表示表格數(shù)據(jù),還有沒(méi)有其他的方法,是的,還有Python List,例如下邊這段代碼
data = [(1, 2., 'Hello'), (2, 3., "World")] pd.DataFrame(data)
我們可以用data這樣的Python List來(lái)表示表格數(shù)據(jù),不同于前邊提到的字典(dict),用List表示的表格數(shù)據(jù)其實(shí)是沒(méi)有行名和列名的,因此Pandas默認(rèn)會(huì)自動(dòng)生成行名和列名,所以上邊的代碼輸出為:
當(dāng)然,自動(dòng)生成的行名列名沒(méi)有任何意義,為了更好的操作數(shù)據(jù),我們還可以通過(guò)設(shè)置pd.DataFrame方法的index或者columns參數(shù)來(lái)指定自己的行名或者列名。
通過(guò)包含Python 字典的Python List
我們繼續(xù)想想,還有什么能夠表示表格數(shù)據(jù)?對(duì)了,包含Python字典的Python List也是可以表達(dá)表格數(shù)據(jù)的,例如下邊的代碼
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] pd.DataFrame(data)
data是一個(gè)Python List,而列表中的每一個(gè)元素都是一個(gè)字典,運(yùn)行結(jié)果為:
類似的,我們也可以通過(guò)指定index或者columns參數(shù)來(lái)修改行名和列名
通過(guò)Series
我們一直在提DataFrame是很多Series的集合(注:Series在DataFrame中可以是一行,也可以是一列),因此,我們也可以通過(guò)Series來(lái)創(chuàng)建DataFrame,例如下邊這段代碼
s1 = pd.Series(np.random.randn(5), name='this_is_name') df = pd.DataFrame(s1) df
利用s1這個(gè)Series來(lái)創(chuàng)建只有一列的DataFrame,輸出結(jié)果為:
還記得不,我們前邊提到了Series的name屬性,在使用Series創(chuàng)建DataFrame的時(shí)候,這個(gè)屬性會(huì)用來(lái)作為列名(或者行名,我們?cè)谙逻叺牧凶涌梢钥吹贸觯?,例如下邊的這段代碼,如果有兩個(gè)Series,我們還可以用下邊這樣的方式創(chuàng)建DataFrame
s1 = pd.Series(np.random.randn(5), name='this_is_name') s2 = s.rename('this_is_new_name') df = pd.DataFrame([s1, s2]) df
這里我們使用了兩個(gè)名分別為this_is_name和this_is_new_name的Series來(lái)創(chuàng)建DataFrame,得到的結(jié)果為:
到這里,相信讀者已經(jīng)對(duì)Pandas提供的數(shù)據(jù)類型有了一個(gè)全面的認(rèn)識(shí)了,并且有能力自己創(chuàng)建Pandas數(shù)據(jù)結(jié)構(gòu),并存儲(chǔ)自己的數(shù)據(jù)了,一個(gè)常見(jiàn)的應(yīng)用場(chǎng)景就是我們通過(guò)爬蟲(chóng)獲取到數(shù)據(jù)以后,可以將這些非結(jié)構(gòu)化的數(shù)據(jù)以Pandas的表格格式保存,值得注意的是數(shù)據(jù)存儲(chǔ)在Pandas數(shù)據(jù)結(jié)構(gòu)中的時(shí)候,數(shù)據(jù)其實(shí)是在內(nèi)存中的,當(dāng)程序被關(guān)閉以后,數(shù)據(jù)就丟失了,如果我們需要將數(shù)據(jù)持久化保存到硬盤(pán)或者數(shù)據(jù)庫(kù)中的話,則可以通過(guò)簡(jiǎn)單的調(diào)用Pandas提供的to_csv, to_json, to_hdf等等接口將數(shù)據(jù)永久保存下來(lái)。
更多Python Pandas庫(kù)的相關(guān)文章,請(qǐng)點(diǎn)擊下面的相關(guān)文章
相關(guān)文章
matplotlib常見(jiàn)函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置)
這篇文章主要介紹了matplotlib常見(jiàn)函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python如何import文件夾下的文件(實(shí)現(xiàn)方法)
下面小編就為大家?guī)?lái)一篇Python如何import文件夾下的文件(實(shí)現(xiàn)方法)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01Python操控Chrome瀏覽器進(jìn)行網(wǎng)頁(yè)操作
這篇文章將為您展示如何通過(guò)Python控制瀏覽器實(shí)現(xiàn)網(wǎng)頁(yè)的打開(kāi)、頁(yè)面的切換和關(guān)閉的基本操作,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06詳解利用Pandas求解兩個(gè)DataFrame的差集,交集,并集
這篇文章主要和大家講解一下如何利用Pandas函數(shù)求解兩個(gè)DataFrame的差集、交集、并集,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07如何利用Python連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存
當(dāng)我們學(xué)習(xí)了mysql數(shù)據(jù)庫(kù)后,我們會(huì)想著該如何將python和mysql結(jié)合起來(lái)運(yùn)用,下面這篇文章主要給大家介紹了關(guān)于如何利用Python連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)儲(chǔ)存的相關(guān)資料,需要的朋友可以參考下2021-11-11Python 寫(xiě)小游戲吃金幣+打乒乓+滑雪(附源碼)
這篇文章主要給大家分享的是利用Python 寫(xiě)小游戲吃金幣、打乒乓、滑雪并附上源碼,具有一的知識(shí)性參考價(jià)值,需要的小伙伴可以參考一下2022-03-03python自動(dòng)化UI工具發(fā)送QQ消息的實(shí)例
今天小編就為大家分享一篇python自動(dòng)化UI工具發(fā)送QQ消息的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08