python學習筆記——pandas

from pandas  import Series,DataFrame

import pandas as  pd

import numpy as np 

行用0,列用1

(一) Series

一種類似一維數組的對象,由一組數據(各種numpy數據類型)以及一組與之相關的數據標籤(即索引)組成

1.創建series

Obj1=Series([1,2,3,4])
#不指定索引會自動添加從0到len(obj)-1
print(obj1)

[結果]

0    1

1    2

2    3

3    4

dtype: int64

#指定索引的情況
obj2=Series([1,2,3,4],index=['one','two','three','four'])
print(obj2)
print('值',obj2.values,'值類型',type(obj2.values))
print('索引',obj2.index,'索引類型',type(obj2.index))

[結果]

one      1

two      2

three    3

four     4

dtype: int64

值 [1 2 3 4] 值類型 <class 'numpy.ndarray'>

索引 Index(['one', 'two', 'three', 'four'], dtype='object') 索引類型 <class 'pandas.core.indexes.base.Index'>

sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}

obj3=Series(sdata) 

【結果】

Ohio      35000

Oregon    16000

Texas     71000

Utah       5000

dtype: int64

states=['California','Ohio','Texas','Oregon','Utah']

obj4=Series(sdata,index=states)

【結果】

California        NaN

Ohio          35000.0

Texas         71000.0

Oregon        16000.0

Utah           5000.0

dtype: float64

 

2.索引

索引取值

print(obj3['Ohio'])
print(obj3[['Ohio','Utah']])

Numpy數組運算(布爾運算、標量乘法、數學函數)等,保留對於索引和值得對應關係

Series利用標籤的切片運算與普通的Python切片運算不同,其末端是包含的

算數運算中自動對齊索引

print(obj3+obj4)

【結果】

California         NaN

Ohio           70000.0

Oregon         32000.0

Texas         142000.0

Utah           10000.0

dtype: float64

Series及索引命名

obj5.name='popultion'
obj5.index.name='state'

【結果】

state

California         NaN

Ohio           70000.0

Oregon         32000.0

Texas         142000.0

Utah           10000.0

Name: popultion, dtype: float64

索引可以就地修改

obj1.index=['aaa','bbb','ccc','ddd']

【結果】

aaa    1

bbb    2

ccc    3

ddd    4

dtype: int64

 

3.缺失數據

NaN表示缺失數據

Obj.isnull()返回布爾型

 

(二) DataFrame

DataFrame中的數據是以一個或多個二維塊存放的

DataFrame 面向行和麪向列的操作基本是平衡的,任意抽出一列都是 Series

1.創建

直接傳入一個等長列表或者NumPy數組組成的字典

data={'state':['California','Ohio','Texas','Oregon','Utah'],
'Year':[2001,2001,2002,2001,2000],
'POP':[1.,2.1,1.5,1.8,2.5]}
frame=DataFrame(data)
print(frame)
print(frame.values)
print(frame.index)
print(frame.columns)

【結果】

   POP  Year       state

0  1.0  2001  California

1  2.1  2001        Ohio

2  1.5  2002       Texas

3  1.8  2001      Oregon

4  2.5  2000        Utah

#以二維數組的形式返回值

[[1.0 2001 'California']

 [2.1 2001 'Ohio']

 [1.5 2002 'Texas']

 [1.8 2001 'Oregon']

 [2.5 2000 'Utah']]

RangeIndex(start=0, stop=5, step=1)

Index(['POP', 'Year', 'state'], dtype='object')

frame2=DataFrame(frame,columns=['Year','state','POP','debt'])
#對於不匹配的列,會產生NaN

【結果】

   Year       state  POP  debt

0  2001  California  1.0   NaN

1  2001        Ohio  2.1   NaN

2  2002       Texas  1.5   NaN

3  2001      Oregon  1.8   NaN

4  2000        Utah  2.5   NaN

2.索引

1)獲取列

通過字典表記或者屬性方式獲取列,返回得是Series,擁有與原DataFrame相同的索引,name屬性也已經設置好.索引方式返回的只是視圖,任何修改都會影響原數據(就地修改)

dataState=frame['state']
print('字典標記',dataState,'數據類型',type(dataState),'names屬性',dataState.name)
print('屬性',frame.Year,'數據類型',type(frame.Year))

【結果】

字典標記 0    California

1          Ohio

2         Texas

3        Oregon

4          Utah

Name: state, dtype: object 數據類型 <class 'pandas.core.series.Series'> names屬性 state

屬性 0    2001

1    2001

2    2002

3    2001

4    2000

Name: Year, dtype: int64 數據類型 <class 'pandas.core.series.Series'>

obj[val]選取DataFrame的單個列或一組列。布爾型數組(過濾行),切片(行切片),布爾型DataFrame(根據條件設置值),通過切片索引或布爾型數組獲得的是行

obj.ix[]選取單個行或者一組行,通過ix切片的索引末端也是包含的

2)獲取行

 

print(frame.ix[0])

【結果】

POP               1

Year           2001

state    California

Name: 0, dtype: object

3)賦值

# 可以賦值標量
frame2['debt']=6

【結果】

   Year       state  POP  debt

0  2001  California  1.0     6

1  2001        Ohio  2.1     6

2  2002       Texas  1.5     6

3  2001      Oregon  1.8     6

4  2000        Utah  2.5     6

# 可以賦一組值,長度需一致
frame2['debt']=range(len(frame2))

【結果】

   Year       state  POP  debt

0  2001  California  1.0     0

1  2001        Ohio  2.1     1

2  2002       Texas  1.5     2

3  2001      Oregon  1.8     3

4  2000        Utah  2.5     4

# 可以賦值數組,長度需一致
frame2['debt']=np.arange(len(frame2))

【結果】

   Year       state  POP  debt

0  2001  California  1.0     0

1  2001        Ohio  2.1     1

2  2002       Texas  1.5     2

3  2001      Oregon  1.8     3

4  2000        Utah  2.5     4

# 可以賦值Series序列,並且索引對應,否則值爲NA
frame2['debt']=Series([3,4,5],index=[2,1,4])

【結果】

   Year       state  POP  debt

0  2001  California  1.0   NaN

1  2001        Ohio  2.1   4.0

2  2002       Texas  1.5   3.0

3  2001      Oregon  1.8   NaN

4  2000        Utah  2.5   5.0

# 不存在的值創造出新的列
frame2['area']=Series(range(100,600,100))

【結果】

   Year       state  POP  debt  area

0  2001  California  1.0   NaN   100

1  2001        Ohio  2.1   4.0   200

2  2002       Texas  1.5   3.0   300

3  2001      Oregon  1.8   NaN   400

4  2000        Utah  2.5   5.0   500

4)刪除列

print(frame2.columns)
del frame2['area']
print(frame2.columns)

【結果】

Index(['Year', 'state', 'POP', 'debt', 'area'], dtype='object')

Index(['Year', 'state', 'POP', 'debt'], dtype='object')

# 只需要傳入數據或者列表,即可刪除指定值,返回除刪除指定值以外的新對象

frame=DataFrame(np.arange(12).reshape(4,3),index=['a','b','c','d'],
columns=['Ohio','Texas','Newyork'])
s1=frame['Ohio']
print('刪除索引a')
print(s1.drop('a'))
print('原s1')
print(s1)

# dataframe可刪除任意軸上的索引值,如果刪除得是列,需要加參數axis=1,默認是0

print('刪除Ohio列')
print(frame.drop(['Ohio'],axis=1))
print(frame.drop('a'))

5)就地修改

dd=frame2['POP'].copy()
dd=6
#原數據沒有改變
print(dd)
print(frame2)

【結果】

6

   Year       state  POP  debt

0  2001  California  1.0   NaN

1  2001        Ohio  2.1   4.0

2  2002       Texas  1.5   3.0

3  2001      Oregon  1.8   NaN

4  2000        Utah  2.5   5.0

frame2['POP']=range(5)
#原數據發生改變
print(frame2)

【結果】

   Year       state  POP  debt

0  2001  California    0   NaN

1  2001        Ohio    1   4.0

2  2002       Texas    2   3.0

3  2001      Oregon    3   NaN

4  2000        Utah    4   5.0

6)嵌套字典(字典中的字典)

不指定的話,會默認外層字典中的鍵爲列索引,內層字典中的鍵爲行索引

china={'beijing':{'food':'RoastDuck','place':'GreatWall','people':'DaMimi'},
       'anhui':{'food':'doufu','place':'yellowMountain','people':'baozheng'},
       'shanghai':{'food':'baozi','place':'dongfangmignzhu','people':'sunli'}}
d1=DataFrame(china)
print(d1)

【輸出】

                 anhui    beijing         shanghai

food             doufu  RoastDuck            baozi

people        baozheng     DaMimi            sunli

place   yellowMountain  GreatWall  dongfangmignzhu

(三)重新索引

Series對象的重新索引通過 reindex(index,method="ffill"/"bfill",fill_value=str)實現

其中,.reindex() 方法會返回一個新對象,其 index 嚴格遵循給出的參數,method:{'backfill', 'bfill', 'pad', 'ffill', None} 參數用於指定插值(填充)方式,當沒有給出時,自動用 fill_value 填充,默認爲 NaN(ffill = pad,bfill = back fill,分別指插值時向前還是向後取值)

DataFrame 對象的重新索引方法爲:.reindex(index=None,columns=None,**kwargs)。

可同時對行、列重新索引,只不過插值方法method 參數只能應用於行,即軸 0。

frame=DataFrame(np.arange(12).reshape(4,3),index=['a','b','c','d'],

columns=['Ohio','Texas','Newyork'])

當只傳入一個參數時用於重新索引行

frame12=frame.reindex(columns=['Ohio','Texas','California','Newyork'])

print frame12

Ohio Texas California Newyork

0 1 NaN 2

3 4 NaN 5

6 7 NaN 8

9 10 NaN 11

使用columns 關鍵字參數,用於給列索引。

frame13=frame.reindex(['a','c','b','d','e'],

columns=['Ohio','Texas','California','Newyork'])

print frame13

Ohio Texas California Newyork

0 1 NaN 2

6 7 NaN 8

3 4 NaN 5

9 10 NaN 11

e NaN NaN NaN NaN

d1.ix[['a','c','b','d','e'], ['Ohio','Texas','California','Newyork']]

#使用ix效果和上面相同

(四)算數運算和數據對齊

Series運算,自動對齊,不重疊的部分引入NaN值;DataFrame的操作會同時發生在行和列上

DataFrame和Series之間的算數運算會將Series索引匹配到DataFrame的列,然後沿着行一直向下傳播,如果希望是匹配行且在列上廣播,則可調用frame.sub(ser,aixs=0)

  排序和排名

1. 排序

對行或者列的索引進行排序,可以使用sort_index()方法;dataFrame.sort_index()默認是按行索引排序,如果加參數sort_index(axis=1),則爲按列索引排序;默認是升序的,也可以通過加參數sort_index(ascending=False)降序排列

如果要按值對series進行排序,則可以使用order()方法,任何缺失值默認值都會被放在末尾;dataFrame.sort_index(by=一個或多個列名)按值排序

2.排名

obj=Series([7,-5,7,4,2,0,4])

obj.rank(method='first',ascending=False)

#按值在原始數據中的出現順序排名

obj.rank(method='max')

#使用整個組的排名最大

frame=DataFrame({'b':[4.3,7,-3,2],'a':[0,1,0,1],'c':[-2,5,8,-2.5]})

frame.rank(axis=1)

#使用列排名

print obj.rank(method='min')#使用整個組的排名最小 

print obj.rank(method='average')#默認:在相等分組中,爲各個值分配平均排名

彙總和描述計算統計

用於從series中提取一個值(均值、總和)或者從dataFrame中提取series,前提都是沒有缺失數據。

dataFrame.mean/sum/var/std/median/mad(axis,skipna,level)求均值/和/方差/標準差/中位數/平均絕對離差

dataFrame.count()非na的個數

axis用於約簡的軸,默認是0即約簡行,也就是按列求和、求均值;axis=1,約簡列,即按行求和求均值;

skipna,默認爲Ture,跳過缺失值,當它不存在,設爲False的話,有缺失值就返回na;

Level,層次化索引,根據level約簡

dataFrame.idmax/idmin()返回最大值最小值的索引

dataFrame.cumsum()累計求和

dataFrame.describe()產生多個彙總統計(針對列)

isin()、value_counts、unique

 

 

處理缺失數據

 

Na處理方法

dropna                 

過濾缺失數據,對於DataFrame類型,默認是過慮掉任何含有缺失值的,加入參數how='all'就是過濾掉全是NA的行,傳入axis=1則丟棄相關列,另外一個有趣的參數是 thresh,該參數的類型爲整數,它的作用是,比如 thresh=3,會在一行中至少有 3 個非 NA 值時將其保留。

fillna

用指定值或差值方法填充缺失數據(ffill前向填充, bfill後向填充)

isnull

返回一個含有布爾值的對象,這些布爾值表示哪些值是缺失值/NA

notnull

isnull的否定式

 

填充缺失數據

fillna()       

 

VALUE

參數爲常數,則缺失值替換爲常數

字典,實現對不同列填充不同的值,例;print(df.fillna({0:"ling",2:"貳"})),分別對第一列和第三列的值進行填充

inplace

默認返回新對象,若想直接填充原對象,加參數inplace=True

method

插值方式,默認ffill

axis

待填充的軸,默認爲0

limit

可以填充的最大數量

 

(八) 層次化索引

1.建立層次化索引

col=MultiIndex.from_arrays([['China','China','China','USA'],['BEIJING','ANHUI','SHANGHAI','NEWYORK']],names=['Country','City'])
row=MultiIndex.from_arrays([['technology','technology','Serviece','Agriculture'],['Semiconductor','High-speed rail','Tourism','Vegetables']],names=['industry','class'])
data=DataFrame(np.arange(16).reshape(4,4),index=row,columns=col)

【結果】

Country                       China                    USA

City                        BEIJING ANHUI SHANGHAI NEWYORK

industry    class                                         

technology  Semiconductor         0     1        2       3

            High-speed rail       4     5        6       7

Serviece    Tourism               8     9       10      11

Agriculture Vegetables           12    13       14      15

Swaplevel(a,b)a和b可以是編號,也可以是名稱,交換a、b,並返回交換後的新對象,數據不變

Sorlevel(a)根據a級別中的值進行排序

2.根據級別彙總統計

# 按列索引求和

print(data.sum(level='Country',axis=1))

#按行索引求和

print(data.sum(level='class'))

2. 使用DataFrame的列

# 將層次化索引轉到列中
data1=data.reset_index()

【結果】

Country     industry            class   China                    USA

City                                  BEIJING ANHUI SHANGHAI NEWYORK

0         technology    Semiconductor       0     1        2       3

1         technology  High-speed rail       4     5        6       7

2           Serviece          Tourism       8     9       10      11

3        Agriculture       Vegetables      12    13       14      15

set_index()函數將一個或者多個列轉換爲行索引,返回一個新的DataFrame,

默認刪除那些列,但是也可以通過drop=False參數設置保留下來

data2=data1.set_index(['industry','class'])

Country                       China                    USA

City                        BEIJING ANHUI SHANGHAI NEWYORK

industry    class                                         

technology  Semiconductor         0     1        2       3

            High-speed rail       4     5        6       7

Serviece    Tourism               8     9       10      11

Agriculture Vegetables           12    13       14      15

stack:將數據的列“旋轉”爲行

unstack:將數據的行‘旋轉’爲列

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章