1. 教程簡(jiǎn)介
本教程分為上、下兩節(jié),,主要針對(duì)機(jī)器學(xué)習(xí)數(shù)據(jù)處理做的簡(jiǎn)單教程,。本教程主要不是講解pandas函數(shù)的使用,而是實(shí)驗(yàn)性的操作學(xué)習(xí)方式,,對(duì)于使用本教程的學(xué)者,,可以根據(jù)課程一步一步去實(shí)驗(yàn),對(duì)于不懂的函數(shù)以及實(shí)現(xiàn)方式可以在官網(wǎng)進(jìn)行查詢,。注意,,重點(diǎn)還是動(dòng)手自己操作。 2. Pandas簡(jiǎn)介 pandas 是基于NumPy 的一種工具,,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,。Pandas 納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所需的工具,。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法,。pandas有三種數(shù)據(jù)結(jié)構(gòu)形式,分別是Series,DataFrame和索引對(duì)象,。本教程上節(jié)也主要是講解著幾種結(jié)構(gòu)形式,,下節(jié)講解pandas在特征工程中常用的操作。 3. Series結(jié)構(gòu)3.1 構(gòu)造和初始化Seriesimport pandas as pdimport numpy as np 3.1.1 通過list來構(gòu)建# Series是一個(gè)一維的數(shù)據(jù)結(jié)構(gòu),,下面是一些初始化Series的方法s = pd.Series([5, 9, "shanghai","shenzhen",7,5.2])s 輸出: # 切片讀取s[1:3] 輸出: # pandas會(huì)默認(rèn)用0到n-1來作為Series的index,,但是我們也可以自己指定index。index我們可以把它理解為dict里面的key,。s = pd.Series([5, 9, "shanghai","shenzhen",5.2],index=["A", "B", "C", "D", "E"])s 輸出: # 通過制定的key獲取元素s["C"] 輸出: 'shanghai'
3.1.2 通過dictionary來構(gòu)建cities = {"Shanghai": 90000, "Foshan": 4500, "Dongguan": 5500, "Beijing": 6600, "Nanjing": 8000, "Lanzhou": None}apts = pd.Series(cities, name="price")apts 輸出:
3.1.2 通過numpy ndarray來構(gòu)建s = pd.Series(np.random.randn(6), index=list("abcdef"))s 輸出: 3.2 數(shù)據(jù)的選擇 對(duì)于Series我們可以向list一樣進(jìn)行元素的獲取,。 3.2.1 通過list方式cities = {"Shanghai": 90000, "Foshan": 4500, "Dongguan": 5500, "Beijing": 6600, "Nanjing": 8000, "Lanzhou": None}apts = pd.Series(cities, name="price")# 獲取元素 list方式apts[[4,3,2]] 輸出: 3.2.2 通過切片方式# 切片方式apts[3:] 輸出:
# 切片方式 :-2表示從0到末尾第二個(gè)apts[:-2] 輸出:
# 讀取到倒數(shù)第一個(gè)apts[:-1] 輸出:
# 從第一個(gè)到最后一個(gè)apts[1:] 輸出:
3.2.2 通過key獲取# 通過key獲取,前面定義的index就是用來選擇數(shù)據(jù)的apts["Shanghai"] 輸出:90000.0 # 通過key組成的list獲取元素,,對(duì)于Series沒有的就返回空apts[["Shenzhen", "Nanjing", "Dongguan"]] 輸出: 3.2.3 判斷元素是否存在
"Shanghai" in apts 輸出:True "Chongqing" in apts 輸出:False 3.2.4 用get讀取元素
# 用讀取元素,,當(dāng)Series中沒有這個(gè)元素時(shí),可以返回我們制定的數(shù),,這里定義為0apts.get("Shanghai", 0) 輸出:90000.0 # apts中沒有Shenzhenapts.get("Shenzhen", 0) 輸出:0
3.2.5 用過bool類型獲取元素
#獲取小于7000的元素apts[apts < 7000] 輸出: # 返回大于平均值的數(shù)apts[apts > apts.median()] 輸出:
# 具體的過程less_than_7000 = apts < 50000less_than_7000 輸出: apts[less_than_7000] 輸出:
3.3 Series元素賦值
對(duì)于Series賦值非常簡(jiǎn)單,,對(duì)于以上我們已經(jīng)拿到了Series,,那我們可以直接對(duì)其賦值就可以。 apts["Shanghai"] = 68000apts 輸出: # 小于50000的都賦值給60000apts[apts < 50000] = 60000apts 輸出: 3.4 Series數(shù)學(xué)運(yùn)算# 每個(gè)元素都乘上2apts * 2 輸出: # 每個(gè)元素都除于2apts / 2 輸出: # 每個(gè)元素都加上10000,,但是對(duì)于值為NAN的元素你做運(yùn)算apts + 10000 輸出: # 平方運(yùn)算apts ** 2 輸出: # 開根號(hào)np.square(apts) 輸出: 3.5 缺損值處理
# 判斷哪個(gè)值不是NaNapts.notnull() 輸出: # 判斷是否有NaNapts.isnull() 輸出: # 對(duì)缺損值進(jìn)行填充apts[apts.isnull()] = apts.mean()apts 輸出: 4. Dataframe結(jié)構(gòu)
Dataframe就像是一張表格,,而Series表示的是一個(gè)以為數(shù)組,Dataframe則是一個(gè)二維數(shù)組,,可以類比成一張Excel表格,,而是Dataframe的一行或者一列則是一個(gè)Series。對(duì)于Dataframe的行用index表示,,列用columns表示,。 4.1 Dataframe的創(chuàng)建
4.1.1 通過dictionary創(chuàng)建 dataframe可以是有一個(gè)dictionary構(gòu)造來創(chuàng)建。 data = {'city': ['Shanghai', 'Nanjing', 'Lanzhou', 'Shangsha', 'Guizhou', 'Xian'],'year': [2017,2018,2017,2018,2018,2017],'population': [2100, 600, 800, 700, 560, 900]}pd.DataFrame(data) 輸出: # 可以指定columns的名字和順序pd.DataFrame(data, columns=["year", "city", "population"]) 輸出: # 創(chuàng)建時(shí)指定index和columnsframe = pd.DataFrame(data, columns=["year", "city", "population", "debt"],index=["one", "two", "three", "four", "five", "six"])frame 輸出:
4.1.2 通過Series創(chuàng)建cars = pd.Series({"Beijing": 300000, "Shanghai": 350000, "Shenzhen": 300000, "Tianjian": 200000, "Guangzhou": 250000, "Chongqing": 150000})cities = {"Shanghai": 90000, "Foshan": 4500, "Dongguan": 5500, "Beijing": 6600, "Nanjing": 8000, "Lanzhou": None}apts = pd.Series(cities, name="price")df = pd.DataFrame({"apts": apts, "cars": cars})df 輸出: 4.1.3 通過dicts的list來構(gòu)建Dataframedata = [{"Beijing": 1000, "Shanghai": 2500, "Nanjing": 9850}, {"Beijing": 5000, "Shanghai": 4600, "Nanjing": 7000}]pd.DataFrame(data) 輸出: # 定義indexdata = [{"Beijing": 1000, "Shanghai": 2500, "Nanjing": 9850}, {"Beijing": 5000, "Shanghai": 4600, "Nanjing": 7000}]pd.DataFrame(data, index=["salary", "other"]) 輸出: 4.2 獲取Dataframe的值
4.2.1 通過列名的方式# 通過列名frame["city"] 輸出:
# 也可以用這種方式,,與上面的效果一樣frame.year 輸出: # 判斷類型type(frame.year) 輸出:pandas.core.series.Series4.2.2 通過loc函數(shù)
# 通過自己定義的index獲取frame.loc["three"] 輸出: # 通過行列名字或者frame.loc["three", "city"] 輸出:Lanzhou 4.2.2 通過iloc函數(shù) 通過iloc方法可以拿到行和列,,直接按照index的順序來取??梢援?dāng)做numpy的ndarray的二維數(shù)組來操作,。 # 獲取前三行frame.iloc[0:3] 輸出:
# 切片操作frame.iloc[0:3, 1:3] 輸出: 4.3 Dataframe賦值 對(duì)于以上獲取到Dataframe以后,要想對(duì)其賦值是很簡(jiǎn)單的,。 frame.loc["one", "population"] = 5555frame 輸出:
# 給一整列賦值frame["debt"] = 1000frame 輸出: # 對(duì)整行賦值frame.loc["six"] = np.NaNframe 輸出: 4.4 獲取columns和index# 獲取columns名frame.columns 輸出:Index(['year', 'city', 'population', 'debt'], dtype='object')
# 獲取index名frame.index 輸出:Index(['one', 'two', 'three', 'four', 'five', 'six'], dtype='object') # 輸出columns名for name in frame.columns:print(name) 輸出: 4.5 用Series指定Dataframe要修改的值
用Series來指定需要修改的index以及相應(yīng)的value,,沒有指定的默認(rèn)用NaN。 val = pd.Series([100, 200, 300], index=['two', 'three', 'four'])frame["debt"] = val * 1000frame 輸出: 4.6 給index與columns指定名字frame.index.name = "row"frame.columns.name = "columns"frame 輸出: 4.6 把Dataframe轉(zhuǎn)換成ndarray 有時(shí)候某些操作需要對(duì)數(shù)據(jù)進(jìn)行裝換numpy.ndarray類型才能進(jìn)行處理,,所以要用values對(duì)Dataframe進(jìn)行轉(zhuǎn)換或者as_matrix函數(shù),。 df.values 輸出: # 判定類型type(df.values) 輸出:numpy.ndarray # 另一個(gè)方法df.as_matrix() 輸出: 4.7 Dataframe刪除操作data = DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],columns = ['one','two','three','four'])print(data)#放一個(gè)標(biāo)量就刪除一行或一列,放一個(gè)數(shù)組就刪除一組行或者一組列print(data.drop(['Colorado','Ohio']))#axis=0:從上到下,,沿著行的方向操作,,axis=1:從左到右,沿著列的方向操作print(data.drop('two',axis=1))print(data.drop(['two','four'],axis=1)) 輸出: 4.8 統(tǒng)計(jì)描述
df = DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]],index=['a', 'b', 'c', 'd'],columns=['one', 'two'])print(df)# 每一列的統(tǒng)計(jì)信息(自己嘗試一下非數(shù)值型變量統(tǒng)計(jì)結(jié)果是什么,?)df.describe() 輸出:
# get index objectobj = pd.Series(range(3), index=["a", "b", "c"])index = obj.indexindex
5. index 5.1 index object
obj = pd.Series([4.5, 2.6, -1.8, 9.4], index=["d", "b", "a", "c"])obj 輸出:Index(['a', 'b', 'c'], dtype='object') 5.2 index 一些操作
# 獲取index元素index[1:] 輸出:Index(['b', 'c'], dtype='object') # index的值是不能被更改的# index[0] = 6 # 構(gòu)造indexindex = pd.Index(np.arange(3))index 輸出:Int64Index([0, 1, 2], dtype='int64') # index的使用obj2 = pd.Series([2,5,7], index=index)obj2 輸出: # 判斷index元素obj2.index is index 輸出:True # 注意與上面的區(qū)別obj2.index is np.arange(3) 輸出:False obj2.index == np.arange(3) 輸出:array([ True, True, True], dtype=bool) # 判斷index是否存在pop = {'Nanjing': {2017: 1000, 2018:1100},'Guangzhou': {2016:800, 2017:850, 2018:880}}frame3 = pd.DataFrame(pop)print(frame3)print("Shanghai" in frame3.columns) 輸出: 2017 in frame3.index 輸出:True 5.3 index 索引與切片# 索引,,按照index的元素進(jìn)行索引obj = pd.Series(range(3), index=["a", "b", "c"])obj["a"] 輸出:0 # 使用index默認(rèn)的數(shù)字進(jìn)行索引obj[[1,2]] 輸出: # 按照bool值進(jìn)行索引obj[obj<2] 輸出: # 切片方式obj["b":"c"] 輸出: obj["b":] 輸出: 5.4 DataFrame 的indexcars = pd.Series({"Beijing": 300000, "Shanghai": 350000, "Shenzhen": 300000, "Tianjian": 200000, "Guangzhou": 250000, "Chongqing": 150000})cities = {"Shanghai": 90000, "Foshan": 4500, "Dongguan": 5500, "Beijing": 6600, "Nanjing": 8000, "Lanzhou": None}apts = pd.Series(cities, name="price")df = pd.DataFrame({"price": apts, "cars": cars})df 輸出: # 通過index獲取元素,沒有的列輸出NaNdf.loc["Beijing":"Guangzhou", ["price", "other"]] 輸出: # 切片獲取df.iloc[2:4, 1:3] 輸出: 注:loc與iloc的區(qū)別,,loc可以用名字進(jìn)行選擇,iloc用index數(shù)字進(jìn)行選擇 5.4 DataFrame 條件選擇
5.4 DataFrame 的index 輸出: # 條件選擇df[df.price > 5000] 輸出: 5.5 Series index重排 把一個(gè)Series或者DataFrame按照新的index順序進(jìn)行重排 obj = pd.Series([4.5, 2.6, -1.8, 9.4], index=["d", "b", "a", "c"])obj 輸出: # 對(duì)index進(jìn)行重排obj.reindex(["a", "b", "c", "d", "e"]) 輸出:
5.6 Series reindex對(duì)NaN進(jìn)行填充把一個(gè)Series或者DataFrame按照新的index順序進(jìn)行重排
obj.reindex(["a", "b", "c", "d", "e"], fill_value=obj.mean()) 輸出:
# 如果為空,,填充前面index的值obj3.reindex(range(6), method="ffill") 輸出: # 獲取后面的值,進(jìn)行填充obj3.reindex(range(6), method="bfill") # backward fill 輸出: 5.7 DataFrame index重排
data = {'city': ['Shanghai', 'Nanjing', 'Lanzhou', 'Shangsha', 'Guizhou', 'Xian'],'year': [2017,2018,2017,2018,2018,2017],'population': [2100, 600, 800, 700, 560, 900]}frame = pd.DataFrame(data, columns=["year", "city", "population", "debt"],index=["one", "two", "three", "four", "five", "six"])frame2 = frame.reindex(["one", "three", "four", "eight"])frame2 輸出: # 對(duì)列進(jìn)行重排frame.reindex(columns=["city", "year", "population"]) 輸出:
5.8 對(duì)index進(jìn)行刪除 對(duì)于使用drop刪除index并不能真正,,只是刪除之后,,返回剩余的部分。 obj3 = pd.Series(["blue", "red", "yello"], index=[1,3,5])obj4 = obj3.drop(5)print(obj4)obj3 輸出: obj3.drop([3,5]) 輸出: # 對(duì)dataframe進(jìn)行dropdata = {'city': ['Shanghai', 'Nanjing', 'Lanzhou', 'Shangsha', 'Guizhou', 'Xian'],'year': [2017,2018,2017,2018,2018,2017],'population': [2100, 600, 800, 700, 560, 900]}frame = pd.DataFrame(data, columns=["year", "city", "population", "debt"],index=["one", "two", "three", "four", "five", "six"])frame.drop(["debt", "year"], axis=1) 輸出: 5.8 Series多層index
# Series的多層index# 構(gòu)造多層indexdata = pd.Series(np.random.randn(10), index= [['a','a','a','b','b','c','c','c','d','d'], [1,2,3,1,2,1,2,3,1,2]])print(data) 輸出: # 獲取index objectdata.index 輸出: # 通過index獲取元素data.b 輸出: # 切片方式data["b":"c"] 輸出: # 通過默認(rèn)的indexdata[2:5] 輸出: 5.9 hierarchical indexing和DataFrame轉(zhuǎn)換可以通過unstack和stack進(jìn)行轉(zhuǎn)換,。 type(data.unstack()) 輸出:data.unstack().stack()data.unstack().stack() 輸出: 5.10 hierarchical indexing & DataFrame
frame = pd.DataFrame(np.arange(12).reshape((4,3)),index = [['a','a','b','b'], [1,2,1,2]],columns = [['xiaoming', 'lisi', 'lisi'], ['one', 'tow', 'three']])frame 輸出:
# 取值frame.loc["a", 1]["lisi"]["tow"] 輸出:1 6. CSV文件讀取6.1 默認(rèn)讀取方式goog = pd.read_csv("data/GOOG.csv")goog.head() #輸出前幾個(gè) 輸出:
6.2 指定index讀取# 讀進(jìn)來的時(shí)候設(shè)置index,聲明哪里列是日期goog = pd.read_csv("data/GOOG.csv", index_col=0, parse_dates=[0])goog.head() 輸出: # 獲取indexgoog.index 輸出:'2004-08-19', '2004-08-20', '2004-08-23', '2004-08-24'.......... 6.3 CSV文件存儲(chǔ)
使用to_csv函數(shù),。 # 以\t的方式進(jìn)行分隔df.to_csv("data/test.tsv", sep="\t") 6. 作圖
# 根據(jù)上面的數(shù)據(jù)作圖# 把圖片輸出到當(dāng)前界面%matplotlib inlinegoog["Adj Close"].plot() 輸出: # 1/1/2010", periods=1000):從這個(gè)日期開始,往后推一千天ts = pd.Series(np.random.randn(1000)*100, index=pd.date_range("1/1/2010", periods=1000))ts = ts.cumsum()ts.plot() 輸出: # dataframe直接繪制圖像df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD"))df = df.cumsum()df.plot() 輸出: # 繪制柱狀圖df.iloc[5].plot(kind="bar") 輸出:
# 狀圖圖# 橫著畫df.head().plot.barh(stacked=True)# 豎著 畫# df.head().plot.bar(stacked=True) 輸出:
對(duì)于機(jī)器學(xué)習(xí)之pandas的應(yīng)用上節(jié)到這里結(jié)束了,對(duì)于跟著這個(gè)教程學(xué)習(xí)的同學(xué),,一定要多操作,,多動(dòng)手。
|