pandas入門練習-資料結構
阿新 • • 發佈:2019-01-03
pandas 是python的一個數據分析包,是基於NumPy 的一種工具,該工具是為了解決資料分析任務而建立的。提供了高效地操作大型資料集所需的工具,使得資料分析工作變著簡單高效。
pandas資料結構介紹
Series是一種類似於一維陣列的物件,它由一維組數(各種Numpy資料型別)以及一組與之相關的資料標籤(即索引)組成。僅由一組資料即可產生最簡單的Series
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
obj=Series([4,7,-5,3])
obj
0 4 1 7 2 -5 3 3 dtype: int64
Series的字串表現形式是:索引在左邊,值在右邊,由於沒有為資料指定索引,就會自動建立一個0到N-1的整數型索引。可以通過Series的values和index屬性獲取其陣列表示形式和索引物件。
obj.values
array([ 4, 7, -5, 3], dtype=int64)
obj.index
RangeIndex(start=0, stop=4, step=1)
我們希望建立的Series帶有一個可以對各個資料點進行標記的索引
obj2=Series([4,7,-5,3],index=['d' ,'b','a','c'])
obj2
d 4
b 7
a -5
c 3
dtype: int64
obj2.index
Index(['d', 'b', 'a', 'c'], dtype='object')
通過索引的方式選取Series中的一個或者一組值
obj2['a']
-5
obj2['d']=6
obj2[['c','a','d']]
c 3
a -5
d 6
dtype: int64
Numpy陣列運算(如根據布林型陣列進行過濾、標量乘法、應用數學函式等)都會保留索引和值之間的連線。
obj2
d 6
b 7
a -5
c 3
dtype: int64
obj2[obj2>0]
d 6
b 7
c 3
dtype: int64
obj2*2
d 12
b 14
a -10
c 6
dtype: int64
np.exp(obj2)
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
可以將Series看成是一個定長的有序字典,因為它是索引值到資料值的一個對映。可以用在許多原本需要字典引數的函式中。
'b' in obj2
True
'k' in obj2
False
如果資料被存放在一個python字典中,通過這個字典來建立Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
pandas的isnull和notnull函式可用於檢測缺失資料
pd.isnull(obj4)
California True
Ohio False
Oregon False
Texas False
dtype: bool
pd.notnull(obj4)
California False
Ohio True
Oregon True
Texas True
dtype: bool
obj4.isnull()
California True
Ohio False
Oregon False
Texas False
dtype: bool
在算術運算中會自動對齊不同索引的資料
obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
obj3+obj4
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
Series物件本身及其索引都有一個name屬性,該屬性跟padans其他的關鍵功能關係很密切
obj4.name='population'
obj4.index.name='state'
obj4
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
Series的索引可通過賦值的方式修改
obj.index=['Bob','Steve','Jeff','Ryan']
obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
###DataFrame表格型資料結構
DataFrame含有一組有序的列,每列可以是不同的值型別(數值、字串、布林型等),有行索引也有列索引,可以看作是由Series組成的字典(共同用一個索引)。DataFrame中面向行和麵向列的基本操作是平衡的。DataFrame中的資料是以一個或多個二維存放的(而不是列表、字典或別的一維資料結構)
構建DataFrame的辦法很多種,最常用的一種是傳入一個由等長列表或者Numpy陣列組成的字典。
data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
frame=DataFrame(data)
frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
結果DataFrame會自動加上索引(跟Series一樣),且全部列會被有序排列。
DataFrame的列會按照指定的列序指定順序進行排列
DataFrame(data,columns=['year','state','pop'])
year | state | pop | |
---|---|---|---|
0 | 2000 | Ohio | 1.5 |
1 | 2001 | Ohio | 1.7 |
2 | 2002 | Ohio | 3.6 |
3 | 2001 | Nevada | 2.4 |
4 | 2002 | Nevada | 2.9 |
和Series同樣,如果傳入的列在資料中找不到,會產生NA值
frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
frame2['state']
one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name: state, dtype: object
frame2.year
one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
frame2.ix['three']
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
列可以通過賦值的方式修改
frame2['debt']=16.5
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 16.5 |
two | 2001 | Ohio | 1.7 | 16.5 |
three | 2002 | Ohio | 3.6 | 16.5 |
four | 2001 | Nevada | 2.4 | 16.5 |
five | 2002 | Nevada | 2.9 | 16.5 |
frame2['debt']=np.arange(5.)
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 0.0 |
two | 2001 | Ohio | 1.7 | 1.0 |
three | 2002 | Ohio | 3.6 | 2.0 |
four | 2001 | Nevada | 2.4 | 3.0 |
five | 2002 | Nevada | 2.9 | 4.0 |
將陣列或者列表賦值給某個列時,其長度需要跟DataFrame的長度相匹配,如果賦值的是一個Series,就會精確匹配DataFrame的索引,所有的空位都會填寫上缺失值。
val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt']=val
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | -1.2 |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | -1.5 |
five | 2002 | Nevada | 2.9 | -1.7 |
為不存在的列賦值會建立一個新列,關鍵字del用於刪除列
frame2['eastern']=frame2.state=='Ohio'
frame2
year | state | pop | debt | eastern | |
---|---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN | True |
two | 2001 | Ohio | 1.7 | -1.2 | True |
three | 2002 | Ohio | 3.6 | NaN | True |
four | 2001 | Nevada | 2.4 | -1.5 | False |
five | 2002 | Nevada | 2.9 | -1.7 | False |
del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
巢狀字典,外層字典的鍵作為列,內層鍵作為行索引
pop={'Nevada':{2001:2.4,2002:2.9},
....:'Ohio':{2000:1.5,2001:107,2002:3.6}}
frame3=DataFrame(pop)
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
對結果進行轉置
frame3.T
2000 | 2001 | 2002 | |
---|---|---|---|
Nevada | NaN | 2.4 | 2.9 |
Ohio | 1.5 | 107.0 | 3.6 |
內層的字典鍵會被合併、排序以形成最終的索引。如果顯示指定了索引,則不會這樣
DataFrame(pop,index=[2001,2002,2003])
Nevada | Ohio | |
---|---|---|
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
2003 | NaN | NaN |
pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}
DataFrame(pdata)
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
下表列出了DataFrame建構函式所能接受的各種資料
如果設定了DataFrame的index和columns的name屬性,則這些資訊也會被顯示出來
frame3.index.name='year';frame3.columns.name='state'
frame3
state | Nevada | Ohio |
---|---|---|
year | ||
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
跟Series一樣,values屬性也會以二維ndarry的形式返回DataFrame中的資料
frame3.values
array([[ nan, 1.5],
[ 2.4, 107. ],
[ 2.9, 3.6]])
如果DataFrame各列的資料型別不同,則值陣列的資料型別就會選用能相容所有列的數
frame2.values
array([[2000, 'Ohio', 1.5, nan],
[2001, 'Ohio', 1.7, -1.2],
[2002, 'Ohio', 3.6, nan],
[2001, 'Nevada', 2.4, -1.5],
[2002, 'Nevada', 2.9, -1.7]], dtype=object)
索引物件:padas物件負責管理軸標籤和其他元資料(比如軸名稱等)。
構建Series和DataFrame時,所用到的任何陣列或其他序列的標籤會被轉換成一個index
obj=Series(range(3),index=['a','b','c'])
index=obj.index
index
Index(['a', 'b', 'c'], dtype='object')
index[1:]
Index(['b', 'c'], dtype='object')
index物件是不可以修改的(immutable),因此使用者不能對其進行修改
index[1]='d'
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-49-8be6e68dba2d> in <module>()
----> 1 index[1]='d'
e:\python\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
1722
1723 def __setitem__(self, key, value):
-> 1724 raise TypeError("Index does not support mutable operations")
1725
1726 def __getitem__(self, key):
TypeError: Index does not support mutable operations
index不可修改的重要性,這樣才能使得index物件在多個數據結構之間安全共享
index=pd.Index(np.arange(3))
obj2=Series([1.5,-2.5,0],index=index)
obj2.index is index
True
下表列出了pandas庫內建的index類
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
'Ohio' in frame3.columns
True
2003 in frame3.index
False
每個索引都一些方法和屬性,可用於設定邏輯並回答有關該索引所包含的資料的常見的問題