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 1 1 2 2 3 3 4 dtype: int64 |
#指定索引的情況 [結果] 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']) |
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' 【結果】 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'], 【結果】 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']) 【結果】 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'] 【結果】 字典標記 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)賦值
# 可以賦值標量 【結果】 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 |
# 可以賦一組值,長度需一致 【結果】 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 |
# 可以賦值數組,長度需一致 【結果】 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 【結果】 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 |
# 不存在的值創造出新的列 【結果】 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) 【結果】 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'], |
# dataframe可刪除任意軸上的索引值,如果刪除得是列,需要加參數axis=1,默認是0 print('刪除Ohio列') |
(5)就地修改
dd=frame2['POP'].copy() 【結果】 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) 【結果】 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 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 a 0 1 NaN 2 b 3 4 NaN 5 c 6 7 NaN 8 d 9 10 NaN 11 使用columns 關鍵字參數,用於給列索引。 frame13=frame.reindex(['a','c','b','d','e'], columns=['Ohio','Texas','California','Newyork']) print frame13 Ohio Texas California Newyork a 0 1 NaN 2 c 6 7 NaN 8 b 3 4 NaN 5 d 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']) 【結果】 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的列
# 將層次化索引轉到列中 【結果】 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:將數據的行‘旋轉’爲列 |