Pandas基礎之DataFrame,Series

pandas使用(1)

note:學習環(huán)境python3.5,pandas庫

pandas是基于NumPy的一個非常好用的庫插勤,正如名字一樣震叮,人見人愛。之所以如此唉匾,就在于無論讀取,處理數(shù)據(jù)用它都非常簡單。

基本的數(shù)據(jù)結構

Pandas有兩種自己獨有的基本數(shù)據(jù)結構巍膘。應該注意的是厂财,它固然有找兩種數(shù)據(jù)結構,因為它依然是Python的一個 庫峡懈,所以璃饱,Python中有的數(shù)據(jù)類型在這里依然使用,也同樣可以使用類自己定義數(shù)據(jù)類型肪康。只不過荚恶,Pandas里面又定義了兩種數(shù)據(jù)類型:Series 和DataFrame,它們讓數(shù)據(jù)操作更簡單了。

以下操作都只基于:

frome pandas import Series,DataFrame
import pandas as pd

為了省事磷支,后面就不在顯示了谒撼。并且如果使用Ipython notebook,只需要開始引入了模塊即可。

1.Series

Series 就如同列表一樣齐唆,一系列數(shù)據(jù)嗤栓,每個數(shù)據(jù)對應一個索引值。比如這樣一個列表:[9, 3, 8]箍邮,如果跟索引值寫到一起茉帅,就是:

data 9 3 8
index 0 1 2

這種樣式我們已經(jīng)熟悉了,不過锭弊,在有些時候堪澎,需要它豎過來表示:

index data
0 9
1 3
2 8

上面兩種,只是表現(xiàn)形式上的差別罷了味滞。

Series就是"豎起來"的list:

s = Series([100,"PYTHON", "Soochow", "Qiwsir"])
s

Out[2]: 
0        100
1     PYTHON
2    Soochow
3     Qiwsir
dtype: object

另外一點也很像列表樱蛤,就是里面的元素的類型,由你任意決定(其實是由需要來決定)剑鞍。

這里昨凡,我們實質上創(chuàng)建了一個 Series 對象,這個==對象當然就有其屬性和方法==了蚁署。比如便脊,下面的兩個屬性依次可以顯示 Series 對象的數(shù)據(jù)值和索引

s.values
s.index

Out[3]
[100 'PYTHON' 'Soochow' 'Qiwsir']
RangeIndex(start=0, stop=4, step=1)

列表的索引只能是從 0 開始的整數(shù),Series 數(shù)據(jù)類型在默認情況下光戈,其索引也是如此哪痰。不過,區(qū)別于列表的是久妆,Series 可以自定義索引:

s2 = Series([100,"PYTHON","Soochow","Qiwsir"],index =["mark","title","university","name"])
s2

Out[4]
mark              100
title          PYTHON
university    Soochow
name           Qiwsir
dtype: object

In [5]:s2.index
Out[5]: Index(['mark', 'title', 'university', 'name'], dtype='object')

自定義索引晌杰,的確比較有意思。就憑這個筷弦,也是必須的肋演。

每個元素都有了索引,就可以根據(jù)索引操作元素了。還記得 list 中的操作嗎惋啃?Series 中哼鬓,也有類似的操作。先看簡單的边灭,根據(jù)索引查看其值和修改其值:

In [10]:s2['name']
Out[10]:
'Qiwsir'
In [11]:
#更改索引的值
s2['name'] = 'AOI'
In [12]:s2
Out[12]:
mark              100
title          PYTHON
university    Soochow
name              AOI
dtype: object

這是不是又有點類似 dict 數(shù)據(jù)了呢异希?的確如此∪奘荩看下面就理解了称簿。

讀者是否注意到,前面定義 Series 對象的時候惰帽,用的是列表憨降,即 Series() 方法的參數(shù)中,第一個列表就是其數(shù)據(jù)值该酗,如果需要定義 index授药,放在后面,依然是一個列表呜魄。除了這種方法之外悔叽,還可以用下面的方法定義 Series 對象:

sd = {"Python":8000,"c++":8100,"c#":4000}
s4 = Series(sd)
s4

Python    8000
c#        4000
c++       8100
dtype: int64

現(xiàn)在是否理解為什么前面那個類似 dict 了?因為本來就是可以這樣定義的爵嗅。

這時候娇澎,索引依然可以自定義。Pandas 的優(yōu)勢在這里體現(xiàn)出來睹晒,如果自定義了索引趟庄,自定的索引會自動尋找原來的索引,如果一樣的伪很,就取原來索引對應的值戚啥,這個可以簡稱為“自動對齊”。

s6 = Series(sd, index =["Java","Python","c++","c#"])
s6

Java         NaN
Python    8000.0
c++       8100.0
c#        4000.0
dtype: float64

注意:在這里values類型變成了float

在 sd 中锉试,只有'python':8000, 'c++':8100, 'c#':4000虑鼎,沒有"java",但是在索引參數(shù)中有键痛,于是其它能夠“自動對齊”的照搬原值,沒有的那個"java"匾七,依然在新 Series 對象的索引中存在絮短,并且自動為其賦值 NaN。在 Pandas 中昨忆,如果沒有值丁频,都對齊賦給 NaN。來一個更特殊的:

ilst = ["java", "perl"]
s5 = Series(sd , index= ilst)
s5

java   NaN
perl   NaN
dtype: float64

新得到的 Series 對象索引與 sd 對象一個也不對應,所以都是 NaN席里。

Pandas 有專門的方法來判斷值是否為空叔磷。

  • pd.isnull() :空->True,不空->False
  • pd.notnull() :空->False,不空->True
In [ ]:
pd.isnull(s6)

Out[ ]:
Java       True
Python    False
c++       False
c#        False
dtype: bool

In [ ]:
pd.notnull(s6)

Out[ ]:
Java      False
Python     True
c++        True
c#         True
dtype: bool

其實,對索引的名字奖磁,是可以從新定義的:

In [ ]:
s6.index =['p1','p2','p3','p4']
s6

Out[ ]:

p1       NaN
p2    8000.0
p3    8100.0
p4    4000.0
dtype: float64

對于 Series 數(shù)據(jù)改基,也可以做類似下面的運算(關于運算,后面還要詳細介紹):

In [ ]:
s3 = Series([3.9,4,7], index =['a','b','c','d']
Out[ ]:
a    3
b    9
c    4
d    7
dtype: int64
In [ ]:
s3[s3 > 5]
Out[ ]:
b    9
d    7
dtype: int64
In [ ]:
s3*5
Out[ ]:
a    15
b    45
c    20
d    35
dtype: int64


In [ ]:
sd = {'Python':8000,'c++':8100, 'c#':4000}
sd1= [800,800,400]
s8 = Series(sd, index =["Java","Python","c++","c#"])
s10 = Series(sd, index =["Python","c++","c#"])
s8+s10

Out[ ]:
Java          NaN
Python        NaN
c#         8000.0
c++       16200.0
ython         NaN
dtype: float64

DataFrame

DataFrame 是一種二維的數(shù)據(jù)結構咖为,非常接近于電子表格或者類似 mysql 數(shù)據(jù)庫的形式秕狰。它的豎行稱之為 columns,橫行跟前面的 Series 一樣躁染,稱之為 index鸣哀,也就是說可以通過 columns 和 index 來確定一個主句的位置。(有人把 DataFrame 翻譯為“數(shù)據(jù)框”吞彤,是不是還可以稱之為“筐”呢我衬?向里面裝數(shù)據(jù)嘛。)

image

在 ipython notebook 環(huán)境/ Python交互式環(huán)境中測試饰恕。

In [ ]:
from pandas import Series, DataFrame
import pandas as pd

data = {"name":['yahoo','google','facebook'],"marks":[200,400,800],"price":[9,3,7]}
f1 = DataFrame(data)
f1
image.png
  • 這是定義一個 DataFrame 對象的常用方法——使用 dict 定義挠羔。

字典的“鍵”("name","marks"懂盐,"price")就是 DataFrame 的 columns 的值(名稱)褥赊,字典中每個“鍵”的“值”是一個列表,它們就是那一豎列中的具體填充數(shù)據(jù)莉恼。上面的定義中沒有確定索引拌喉,所以,按照慣例(Series 中已經(jīng)形成的慣例)就是從 0 開始的整數(shù)俐银。從上面的結果中很明顯表示出來尿背,這就是一個二維的數(shù)據(jù)結構(類似 excel 或者 mysql 中的查看效果)。

上面的數(shù)據(jù)顯示中捶惜,columns 的順序沒有規(guī)定田藐,就如同字典中鍵的順序一樣,但是在 DataFrame 中吱七,columns 跟字典鍵相比汽久,有一個明顯不同,就是其順序可以被規(guī)定踊餐,向下面這樣做:

f2 = DataFrame(data, columns = ['name','price','marks'])
f2
image.png

跟 Series 類似的景醇,DataFrame 數(shù)據(jù)的索引也能夠自定義。

f3 = DataFrame(data, columns=['name','price','marks','debt'],index =['a','b','c','d'])

這樣將會報錯吝岭,在交互狀態(tài)下:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/pymodules/python2.7/pandas/core/frame.py", line 283, in __init__ 
    mgr = self._init_dict(data, index, columns, dtype=dtype) 
    File "/usr/lib/pymodules/python2.7/pandas/core/frame.py", line 368, in _init_dict 
    mgr = BlockManager(blocks, axes) 
    File "/usr/lib/pymodules/python2.7/pandas/core/internals.py", line 285, in __init__ 
    self._verify_integrity() 
    File "/usr/lib/pymodules/python2.7/pandas/core/internals.py", line 367, in _verify_integrity 
    assert(block.values.shape[1:] == mgr_shape[1:]) 
AssertionError 

在jupyter notebook下:

ValueError: Shape of passed values is (4, 3), indices imply (4, 4)

python交互狀態(tài)下沒有提供什么線索三痰,這就是交互模式的不利之處吧寺。在jupyter notebook顯示錯誤在于 index 的值——列表——的數(shù)據(jù)項多了一個,data 中是三行散劫,這里給出了四個項(['a','b','c','d'])稚机。

修改后:

f3 = DataFrame(data, columns=['name','price','marks','debt'],index =['a','b','c'])
image.png

還要注意觀察上面的顯示結果。因為在定義 f3 的時候获搏,columns 的參數(shù)中赖条,比以往多了一項('debt'),但是這項在 data 這個字典中并沒有颜凯,所以 debt 這一豎列的值都是空的谋币,在 Pandas 中,空就用 NaN 來代表了症概。

  • 定義 DataFrame 的方法蕾额,除了上面的之外,還可以使用“字典套字典”的方式彼城。
newdata = {"lang":{"firstline":"Python","aecondline":"java"},"price":{"firstline":8000}
f4 = DataFrame(newdata)
f4
image.png

在字典中就規(guī)定好數(shù)列名稱(第一層鍵)和每橫行索引(第二層字典鍵)以及對應的數(shù)據(jù)(第二層字典值)诅蝶,也就是在字典中規(guī)定好了每個數(shù)據(jù)格子中的數(shù)據(jù),沒有規(guī)定的都是空募壕。

f5 = DataFrame(newdata, index =["firstline","secondline","thirdline"])
f5
image.png

如果額外確定了索引调炬,就如同上面顯示一樣,除非在字典中有相應的索引內容舱馅,否則都是 NaN缰泡。

前面定義了 DataFrame 數(shù)據(jù)(可以通過兩種方法),它也是一種對象類型代嗤,比如變量 f3 引用了一個對象棘钞,它的類型是 DataFrame。承接以前的思維方法:對象有屬性和方法干毅。

In [ ]:
f3.columns

Out[ ]:
Index(['name', 'price', 'marks', 'debt'], dtype='object')

In [ ]:
f3['name']

Out[ ]:
a       yahoo
b      google
c    facebook
Name: name, dtype: object

這是什么宜猜?這其實就是一個 Series,或者說硝逢,可以將 DataFrame 理解為是有一個一個的 Series 組成的姨拥。

一直耿耿于懷沒有數(shù)值的那一列,下面的操作是統(tǒng)一給那一列賦值:

f3['debt']=89.2
f3
image.png

下面的操作是分別給那一列賦值:

f3['debt']=[89.2,55,89]
f3
image.png

除了能夠統(tǒng)一賦值之外渠鸽,還能夠“點對點”添加數(shù)值叫乌,結合前面的 Series,既然 DataFrame 對象的每豎列都是一個 Series 對象徽缚,那么可以先定義一個 Series 對象综芥,然后把它放到 DataFrame 對象中。如下:

sdebt = Series([2.2,3.3], index =['a','c'])#注意索引
f3['debt'] =sdebt
f3

將 Series 對象(sdebt 變量所引用) 賦給 f3['debt']列猎拨,Pandas 的一個重要特性——自動對齊——在這里起做用了膀藐,在 Series 中,只有兩個索引("a","c")红省,它們將和 DataFrame 中的索引自動對齊额各。于是乎:


image.png

自動對齊之后,沒有被復制的依然保持 NaN吧恃。

還可以更精準的修改數(shù)據(jù)嗎虾啦?當然可以,完全仿照字典的操作:

f3['prce']['c'] =300
f3
image.png

這就是 Pandas 中的兩種數(shù)據(jù)對象痕寓。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末傲醉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呻率,更是在濱河造成了極大的恐慌硬毕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礼仗,死亡現(xiàn)場離奇詭異吐咳,居然都是意外死亡,警方通過查閱死者的電腦和手機元践,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門韭脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人单旁,你說我怎么就攤上這事沪羔。” “怎么了象浑?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵蔫饰,是天一觀的道長。 經(jīng)常有香客問我融柬,道長死嗦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任粒氧,我火速辦了婚禮越除,結果婚禮上,老公的妹妹穿的比我還像新娘外盯。我一直安慰自己摘盆,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布饱苟。 她就那樣靜靜地躺著孩擂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箱熬。 梳的紋絲不亂的頭發(fā)上类垦,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天狈邑,我揣著相機與錄音,去河邊找鬼蚤认。 笑死米苹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的砰琢。 我是一名探鬼主播蘸嘶,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陪汽!你這毒婦竟也來了训唱?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤挚冤,失蹤者是張志新(化名)和其女友劉穎况增,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體你辣,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡巡通,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舍哄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴凉。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖表悬,靈堂內的尸體忽然破棺而出弥锄,到底是詐尸還是另有隱情,我是刑警寧澤蟆沫,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布籽暇,位于F島的核電站,受9級特大地震影響饭庞,放射性物質發(fā)生泄漏戒悠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一舟山、第九天 我趴在偏房一處隱蔽的房頂上張望绸狐。 院中可真熱鬧,春花似錦累盗、人聲如沸寒矿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽符相。三九已至,卻和暖如春蠢琳,著一層夾襖步出監(jiān)牢的瞬間啊终,已是汗流浹背镜豹。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓝牲,地道東北人逛艰。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像搞旭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菇绵,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容