Python pandas學習總結
本來打算學習pandas模組,並寫一個部落格記錄一下自己的學習,但是不知道怎麼了,最近好像有點急功近利,就想把別人的東西複製過來,當心沉下來,自己自覺地將原本寫滿的pandas學習筆記刪除了,這次打算寫上自己的學習記錄,這裡送給自己一句話,同時送給看這篇部落格的人,共勉
當你迷茫的時候,當你飽受煎熬的時候,請停下來,想想自己學習的初衷,想想自己寫部落格的初衷,愛你所愛,行你所行,聽從你心,無問西東。
好了,正文開始。
pandas是做資料分析非常重要的一個模組,它使得資料分析的工作變得更快更簡單。由於現實世界中資料來源的格式非常多,但是pandas也支援了不同資料格式的匯入方法,所以學習pandas非常有必要。
本文首先記錄一下自己學習read_csv的筆記,當然了自己需要用什麼,就學習什麼,而不是記錄人家read_csv的所有方法,要是想看所有的方法詳解可以去官網,要想學習Pandas建議先看下面2個網站。
官網地址如下:https://pandas.pydata.org/
官網教程如下(十分鐘搞定pandas):https://pandas.pydata.org/pandas-docs/stable/10min.html
NAN (數值資料型別的一類數),全稱Not a Number ,表示未定義或者不可表示的值。
一:read_csv方法
1,準備CSV檔案
Train_A_001.csv檔案內容如下:
0.916,4.37,-1.372,0.102,0.041,0.069,0.018 0.892,3.955,-1.277,0.015,-0.099,-0.066,0.018 0.908,3.334,-1.193,0.033,-0.098,-0.059,0.018 1.013,3.022,-1.082,0.151,0.015,0.035,0.018 1.111,2.97,-1.103,-0.048,-0.175,-0.171,0.019 1.302,3.043,-1.089,0.011,-0.085,-0.097,0.018 1.552,3.017,-1.052,0.066,-0.002,-0.036,0.019 1.832,2.796,-0.933,0.002,-0.028,-0.075,0.019 2.127,2.521,-0.749,0.011,0.041,-0.022,0.019 2.354,2.311,-0.623,-0.038,0.012,-0.056,0.019 2.537,2.024,-0.452,0.039,0.089,0.031,0.019 2.639,1.669,-0.277,-0.005,0.036,-0.008,0.019 2.707,1.314,-0.214,0.013,0.031,-0.005,0.019 2.81,0.926,-0.142,0.062,0.046,0.031,0.019
2,直接讀取檔案內容
read_csv讀取的資料型別為Dataframe,通過obj.dtypes可以檢視每列的資料型別
首先說一下,我這段csv檔案是沒有列索引的,那麼我的讀取程式碼如下可以讀取到什麼呢?
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename) print(data)
結果如下;
0.916 4.37 -1.372 0.102 0.041 0.069 0.018 0 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 1 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 2 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 3 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019 4 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018 5 1.552 3.017 -1.052 0.066 -0.002 -0.036 0.019 6 1.832 2.796 -0.933 0.002 -0.028 -0.075 0.019 7 2.127 2.521 -0.749 0.011 0.041 -0.022 0.019 8 2.354 2.311 -0.623 -0.038 0.012 -0.056 0.019 9 2.537 2.024 -0.452 0.039 0.089 0.031 0.019 10 2.639 1.669 -0.277 -0.005 0.036 -0.008 0.019 11 2.707 1.314 -0.214 0.013 0.031 -0.005 0.019 12 2.810 0.926 -0.142 0.062 0.046 0.031 0.019
大家可以發現,它預設你有列索引,並且把第一行的資料當做列索引,並且從第二行開始設定了行索引,所以說列索引的設定非常重要,起碼在這裡看來是這樣的,那麼如何設定呢,下面就具體分析一下。
3,列索引 header=?的含義
當加上header=None的時候,表明原始檔案沒有列索引,這樣的話會預設自動加上,除非你給定名稱。結果如下:
0 1 2 3 4 5 6 0 0.916 4.370 -1.372 0.102 0.041 0.069 0.018 1 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 2 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 3 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 4 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019 5 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018 6 1.552 3.017 -1.052 0.066 -0.002 -0.036 0.019 7 1.832 2.796 -0.933 0.002 -0.028 -0.075 0.019 8 2.127 2.521 -0.749 0.011 0.041 -0.022 0.019 9 2.354 2.311 -0.623 -0.038 0.012 -0.056 0.019 10 2.537 2.024 -0.452 0.039 0.089 0.031 0.019 11 2.639 1.669 -0.277 -0.005 0.036 -0.008 0.019 12 2.707 1.314 -0.214 0.013 0.031 -0.005 0.019 13 2.810 0.926 -0.142 0.062 0.046 0.031 0.019
當加上header=0的時候,表明原始檔案的第0行為列索引。結果如下:
0.916 4.37 -1.372 0.102 0.041 0.069 0.018 0 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 1 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 2 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 3 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019 4 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018 5 1.552 3.017 -1.052 0.066 -0.002 -0.036 0.019 6 1.832 2.796 -0.933 0.002 -0.028 -0.075 0.019 7 2.127 2.521 -0.749 0.011 0.041 -0.022 0.019 8 2.354 2.311 -0.623 -0.038 0.012 -0.056 0.019 9 2.537 2.024 -0.452 0.039 0.089 0.031 0.019 10 2.639 1.669 -0.277 -0.005 0.036 -0.008 0.019 11 2.707 1.314 -0.214 0.013 0.031 -0.005 0.019 12 2.810 0.926 -0.142 0.062 0.046 0.031 0.019
從這段程式碼我們可以發現,少了一行,所以第一行的程式碼也被預設為列索引。
當沒有列索引的時候,我們也可以自己指定索引名稱,方便自己記錄,程式碼如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,header=None,names=('a','b','c','d','e','f','g')) print(data)
通過上述程式碼,我們可以指定列索引為a~f,結果如下:
a b c d e f g 0 0.916 4.370 -1.372 0.102 0.041 0.069 0.018 1 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 2 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 3 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 4 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019 5 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018 6 1.552 3.017 -1.052 0.066 -0.002 -0.036 0.019 7 1.832 2.796 -0.933 0.002 -0.028 -0.075 0.019 8 2.127 2.521 -0.749 0.011 0.041 -0.022 0.019 9 2.354 2.311 -0.623 -0.038 0.012 -0.056 0.019 10 2.537 2.024 -0.452 0.039 0.089 0.031 0.019 11 2.639 1.669 -0.277 -0.005 0.036 -0.008 0.019 12 2.707 1.314 -0.214 0.013 0.031 -0.005 0.019 13 2.810 0.926 -0.142 0.062 0.046 0.031 0.019
4,行索引 index_col = ?的含義
從上面的程式碼,我們可以發現,沒有行索引,只要設定了列索引就行,但是真的行索引不重要嗎,當然不是,有些時候有些需求也是需要列索引為自己定義的名稱,這裡我們同樣看待,並學習一下:
當設定行索引為None的時候,也就是index_col = None,同時設定列索引的時候,程式碼如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None) print(data)
結果呢,如下:
0 1 2 3 4 5 6 0 0.916 4.370 -1.372 0.102 0.041 0.069 0.018 1 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 2 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 3 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 4 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019 5 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018 6 1.552 3.017 -1.052 0.066 -0.002 -0.036 0.019 7 1.832 2.796 -0.933 0.002 -0.028 -0.075 0.019 8 2.127 2.521 -0.749 0.011 0.041 -0.022 0.019 9 2.354 2.311 -0.623 -0.038 0.012 -0.056 0.019 10 2.537 2.024 -0.452 0.039 0.089 0.031 0.019 11 2.639 1.669 -0.277 -0.005 0.036 -0.008 0.019 12 2.707 1.314 -0.214 0.013 0.031 -0.005 0.019 13 2.810 0.926 -0.142 0.062 0.046 0.031 0.019
5,讀取指定csv的某一列 usecols = [?]
當然了,在做資料分析的許多時候,我們會讀取指定的某一列,使用的函式如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None,usecols=[1]) print(data)
上面意思是使用第一列資料(列表預設從0開始的啊),結果如下:
1 0 4.370 1 3.955 2 3.334 3 3.022 4 2.970 5 3.043 6 3.017 7 2.796 8 2.521 9 2.311 10 2.024 11 1.669 12 1.314 13 0.926
要想一起讀取三列,則程式碼如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None,usecols=[1,2,3]) print(data)
結果如下:
1 2 3 0 4.370 -1.372 0.102 1 3.955 -1.277 0.015 2 3.334 -1.193 0.033 3 3.022 -1.082 0.151 4 2.970 -1.103 -0.048 5 3.043 -1.089 0.011 6 3.017 -1.052 0.066 7 2.796 -0.933 0.002 8 2.521 -0.749 0.011 9 2.311 -0.623 -0.038 10 2.024 -0.452 0.039 11 1.669 -0.277 -0.005 12 1.314 -0.214 0.013 13 0.926 -0.142 0.062
6 讀取csv前幾行內容
使用data.head(n)返回檔案的前n行內容,示例如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data1 = pd.read_csv(filename,index_col=None,header=None) # print(data1) #讀取檔案的前5行 headdata = data1.head(5) print(headdata)
執行效果,返回前5行所有資料內容:
0 1 2 3 4 5 6 0 0.916 4.370 -1.372 0.102 0.041 0.069 0.018 1 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 2 0.908 3.334 -1.193 0.033 -0.098 -0.059 0.018 3 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 4 1.111 2.970 -1.103 -0.048 -0.175 -0.171 0.019
7,返回某行-所有列
下面程式碼表示了函式loc返回了第一行所有列的資料,也就是說第一行的資料:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None) # print(data1) data1 = data.loc[0,:] print(data1)
由此我們可以推斷出,某幾行-所有列的資料,程式碼如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None) # print(data1) # 返回第n行所有列的資料 data1 = data.loc[[1,3,5],:] print(data1)
結果展示一下:
0 1 2 3 4 5 6 1 0.892 3.955 -1.277 0.015 -0.099 -0.066 0.018 3 1.013 3.022 -1.082 0.151 0.015 0.035 0.018 5 1.302 3.043 -1.089 0.011 -0.085 -0.097 0.018
8,返回所有行-所有列
獲取所有行所有列,直接看程式碼:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None) # print(data1) # 返回第n行所有列的資料 data1 = data.loc[:,:] print(data1)
結果就是所有行,所有列,這裡就不展示了。
9,返回某行-所有列
import pandas as pd filename = r'Train_A/Train_A_001.csv' data = pd.read_csv(filename,index_col=None,header=None) # print(data1) # 返回所有列-某行的資料 data1 = data.loc[:,0] print(data1)
執行效果如下:
0 0.916 1 0.892 2 0.908 3 1.013 4 1.111 5 1.302 6 1.552 7 1.832 8 2.127 9 2.354 10 2.537 11 2.639 12 2.707 13 2.810 Name: 0, dtype: float64
10,資料統計
describe()統計下資料量,標準值,平均值,最大值等
data.describe()
就拿上面的csv檔案為例,讀取結果,解析如下:
import pandas as pd filename = r'Train_A/Train_A_001.csv' data1 = pd.read_csv(filename,index_col=None,header=None) # print(data1) print(data1.describe())
結果如下:
0 1 ... 5 6 count 14.000000 14.000000 ... 14.000000 14.000000 mean 1.764286 2.662286 ... -0.030643 0.018643 std 0.748950 0.957612 ... 0.063172 0.000497 min 0.892000 0.926000 ... -0.171000 0.018000 25% 1.037500 2.095750 ... -0.064250 0.018000 50% 1.692000 2.883000 ... -0.029000 0.019000 75% 2.491250 3.037750 ... 0.022000 0.019000 max 2.810000 4.370000 ... 0.069000 0.019000 [8 rows x 7 columns]
既然瞭解了pandas,以後也需要使用,那麼我就不止想學習讀取csv了,我還想學習基本的pandas資料結構,起碼以後使用會知道一些,下面學習一下pandas其的基本資料結構。
二:pandas的基本資料結構
pandas是基於Numpy的一個非常好用的庫,正如名字一樣,人見人愛,之所以如下,就在於不論是讀取,處理資料,使用它都非常簡單。
pandas有兩種自己獨有的基本資料結構,即使如此,但是它依然只是Python的一個庫,所以Python中有的資料型別在這裡依然使用,同樣還可以使用類自己定義的資料型別,只不過,pandas裡面又定義了兩種資料型別:Series和DataFrame。
1,Series
series就如同列表一樣,一系列資料,每個資料對應於一個索引值,比如這樣一個列表:[9,3,8],如果跟索引值寫到一起,就是這樣:
這種樣式我們已經熟悉了,不過有些時候,需要將其豎起來表示:
上面兩種,只是表現形式上的差別罷了。
Series就是“豎起來”的列表。舉個例子:
import pandas as pd s = pd.Series([1,2,3,'python']) s 0 1 1 2 2 3 3 python dtype: object
另外一點也很像列表,就是裡面的元素的型別,由我們任意決定。
這裡,我們實質上建立了一個Series物件,這個物件當然就有其屬性和方法了,比如下面兩個屬性依次可以顯示Series物件的資料值和索引:
s.values array([1, 2, 3, 'python'], dtype=object) s.index RangeIndex(start=0, stop=4, step=1)
由於列表的索引只能是從0開始的整數,Series資料型別在預設情況下,其索引也是如次,不過區別於列表的是,Series可以自定義索引:
s = pd.Series(['java','python'],index=['1','2']) s 1 java 2 python dtype: object
自定義索引之後,我們就可以根據索引操作元素,series也可以學習list操作:
s['1'] 'java'
當然了,前面定義Series物件的是,用的是列表,即 Series() 方法的引數中,第一個列表就是其資料值,如果需要定義 index,放在後面,依然是一個列表。除了這種方法之外,還可以用下面的方法定義 Series 物件:
s = {'python':800,'java':600,'c++':1000} s = pd.Series(s) s python 800 java 600 c++ 1000 dtype: int64
這樣的話,索引依然可以自定義,pandas的優勢就在這裡體現出來,如果自定義了索引,自定的索引會自動尋找原來的索引,如果一樣的話,就取代原來索引對應的值,這個可以簡稱為“自動對齊”,我們舉例說明:
s = pd.Series(s,index=['python','java','c','c++']) s python 800.0 java 600.0 c NaN c++ 1000.0 dtype: float64
在裡面,沒有c,但是索引引數中有,於是其他能夠“自動對齊”的照搬原值,依然可以在新的Series物件的索引中存在,並且可以自動為其賦值NaN,如果pandas中沒有值,都對齊賦值給NaN,下面來一個更特殊的:
ilist = ['a','b','c'] s = pd.Series(s,index=ilist) s a NaN b NaN c NaN dtype: float64
這樣的話,新得到的Series物件索引與s物件的值一個也不對應,所以都是NaN。pandas有專門的方法來判斷值是否為空。
pd.isnull(s) a True b True c True dtype: bool
也可以判斷不為空:
pd.notnull(s) a False b False c False dtype: bool
當然了,也可以對索引的名字,重新定義:
s = [1,2,3,4] s = pd.Series(s,index=['python','java','c','c++']) s python 1 java 2 c 3 c++ 4 dtype: int64 s.index = ['a','b','c','d'] s a 1 b 2 c 3 d 4 dtype: int64
2,DataFrame
DataFrame是一個表格型的資料結構,它含有一組有序的列,每類可以是不同的值型別(數值,字串,布林值)。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典(共同使用同一個索引)。跟其他類似的資料結構相比(如R的data.frame)DataFrame中面向行和麵向列的操作基本上是平衡的,其實DataFrame中的資料是以一個或者多個二維塊存放的(而不是列表,字典或者其他一維資料結構)。
DataFrame 是一種二維的資料結構,非常接近於電子表格或者類似 mysql 資料庫的形式。它的豎行稱之為 columns,橫行跟前面的 Series 一樣,稱之為 index,也就是說可以通過 columns 和 index 來確定一個主句的位置。(有人把 DataFrame 翻譯為“資料框”,是不是還可以稱之為“筐”呢?向裡面裝資料嘛。)
首先給一個例子:
>>> import pandas as pd >>> from pandas import Series, DataFrame >>> data = {"name":["yahoo","google","facebook"], "marks": [200,400,800], "price":[9, 3, 7]} >>> f1 = DataFrame(data) >>> f1 marks name price 0 200 yahoo 9 1 400 google 3 2 800 facebook 7
這是定義一個 DataFrame 物件的常用方法——使用 dict 定義。字典的“鍵”("name","marks","price")就是 DataFrame 的 columns 的值(名稱),字典中每個“鍵”的“值”是一個列表,它們就是那一豎列中的具體填充資料。上面的定義中沒有確定索引,所以,按照慣例(Series 中已經形成的慣例)就是從 0 開始的整數。從上面的結果中很明顯表示出來,這就是一個二維的資料結構(類似 excel 或者 mysql 中的檢視效果)。
上面的資料顯示中,columns 的順序沒有規定,就如同字典中鍵的順序一樣,但是在 DataFrame 中,columns 跟字典鍵相比,有一個明顯不同,就是其順序可以被規定,向下面這樣做:
>>> f2 = DataFrame(data, columns=['name','price','marks']) >>> f2 name price marks 0 yahoo 9 200 1 google 3 400 2 facebook 7 800
跟Series類似的,DataFrame資料的索引也可以自定義:
>>> f3 = DataFrame(data, columns=['name', 'price', 'marks', 'debt'], index=['a','b','c']) >>> f3 name price marks debt a yahoo 9 200 NaN b google 3 400 NaN c facebook 7 800 NaN
大家還要注意觀察上面的顯示結果。因為在定義 f3 的時候,columns 的引數中,比以往多了一項('debt'),但是這項在 data 這個字典中並沒有,所以 debt 這一豎列的值都是空的,在 Pandas 中,空就用 NaN 來代表了。
定義 DataFrame 的方法,除了上面的之外,還可以使用“字典套字典”的方式。
>>> newdata = {"lang":{"firstline":"python","secondline":"java"}, "price":{"firstline":8000}} >>> f4 = DataFrame(newdata) >>> f4 lang price firstline python 8000 secondline java NaN
在字典中就規定好數列名稱(第一層鍵)和每橫行索引(第二層字典鍵)以及對應的資料(第二層字典值),也就是在字典中規定好了每個資料格子中的資料,沒有規定的都是空。
>>> DataFrame(newdata, index=["firstline","secondline","thirdline"]) lang price firstline python 8000 secondline java NaN thirdline NaN NaN
如果額外確定了索引,就如同上面顯示一樣,除非在字典中有相應的索引內容,否則都是 NaN。
前面定義了 DataFrame 資料(可以通過兩種方法),它也是一種物件型別,比如變數 f3 引用了一個物件,它的型別是 DataFrame。承接以前的思維方法:物件有屬性和方法。
>>> f3.columns Index(['name', 'price', 'marks', 'debt'], dtype=object)
DataFrame 物件的 columns 屬性,能夠顯示素有的 columns 名稱。並且,還能用下面類似字典的方式,得到某豎列的全部內容(當然包含索引):
>>> f3['name'] a yahoo b google c facebook Name: name
這是什麼?這其實就是一個 Series,或者說,可以將 DataFrame 理解為是有一個一個的 Series 組成的。
一直耿耿於懷沒有數值的那一列,下面的操作是統一給那一列賦值:
>>> f3['debt'] = 89.2 >>> f3 name price marks debt a yahoo 9 200 89.2 b google 3 400 89.2 c facebook 7 800 89.2
除了能夠統一賦值之外,還能夠“點對點”新增數值,結合前面的 Series,既然 DataFrame 物件的每豎列都是一個 Series 物件,那麼可以先定義一個 Series 物件,然後把它放到 DataFrame 物件中。如下:
>>> sdebt = Series([2.2, 3.3], index=["a","c"]) #注意索引 >>> f3['debt'] = sdebt
將 Series 物件(sdebt 變數所引用) 賦給 f3['debt']列,Pandas 的一個重要特性——自動對齊——在這裡起做用了,在 Series 中,只有兩個索引("a","c"),它們將和 DataFrame 中的索引自動對齊。於是乎:
>>> f3 name price marks debt a yahoo 9 200 2.2 b google 3 400 NaN c facebook 7 800 3.3
自動對齊之後,沒有被複制的依然保持 NaN。
還可以更精準的修改資料嗎?當然可以,完全仿照字典的操作:
>>> f3["price"]["c"]= 300 >>> f3 name price marks debt a yahoo 9 200 2.2 b google 3 400 NaN c facebook 300 800 3.3
三,Pandas速查手冊(翻譯官網)
此外,在學習的時候,我參考了別人的知乎內容,並檢視官網,然後彙總了pandas官網中比較常用的函式和方法,以方便自己記憶。其實這個比較全面的概括了pandas的所有知識點,只不過沒有舉例子,但是要是認真看了我上面的兩個大的例子,學習下面的知識點,根本不費吹灰之力。
1,關鍵縮寫和包的匯入
首先,我們使用如下的縮寫:
df:任意的Pandas DataFrame物件 s:任意的Pandas Series物件
同時匯入pandas包和numpy包
import pandas as pd import numpy as np
當看到np和pd的時候,我們就知道其是什麼含義(這些縮寫都是大家預設的)。
2,匯入資料
- pd.read_csv(filename):從CSV檔案匯入資料
- pd.read_table(filename):從限定分隔符的文字檔案匯入資料
- pd.read_excel(filename):從Excel檔案匯入資料
- pd.read_sql(query, connection_object):從SQL表/庫匯入資料
- pd.read_json(json_string):從JSON格式的字串匯入資料
- pd.read_html(url):解析URL、字串或者HTML檔案,抽取其中的tables表格
- pd.read_clipboard():從你的貼上板獲取內容,並傳給read_table()
- pd.DataFrame(dict):從字典物件匯入資料,Key是列名,Value是資料
原文:
pd.read_csv(filename) | From a CSV file pd.read_table(filename) | From a delimited text file (like TSV) pd.read_excel(filename) | From an Excel file pd.read_sql(query, connection_object) | Read from a SQL table/database pd.read_json(json_string) | Read from a JSON formatted string, URL or file. pd.read_html(url) | Parses an html URL, string or file and extracts tables to a list of dataframes pd.read_clipboard() | Takes the contents of your clipboard and passes it to read_table() pd.DataFrame(dict) | From a dict, keys for columns names, values for data as lists
3,匯出資料
- df.to_csv(filename):匯出資料到CSV檔案
- df.to_excel(filename):匯出資料到Excel檔案
- df.to_sql(table_name, connection_object):匯出資料到SQL表
- df.to_json(filename):以Json格式匯出資料到文字檔案
原文:
df.to_csv(filename) | Write to a CSV file df.to_excel(filename) | Write to an Excel file df.to_sql(table_name, connection_object) | Write to a SQL table df.to_json(filename) | Write to a file in JSON format
4,建立測試物件
- pd.DataFrame(np.random.rand(20,5)):建立20行5列的隨機陣列成的DataFrame物件
- pd.Series(my_list):從可迭代物件my_list建立一個Series物件
- df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一個日期索引
原文:
pd.DataFrame(np.random.rand(20,5)) | 5 columns and 20 rows of random floats pd.Series(my_list) | Create a series from an iterable my_list df.index = pd.date_range('1900/1/30', periods=df.shape[0]) | Add a date index
5,檢視,檢查資料
- df.head(n):檢視DataFrame物件的前n行
- df.tail(n):檢視DataFrame物件的最後n行
- df.shape():檢視行數和列數
- http://df.info():檢視索引、資料型別和記憶體資訊
- df.describe():檢視數值型列的彙總統計
- s.value_counts(dropna=False):檢視Series物件的唯一值和計數
- df.apply(pd.Series.value_counts):檢視DataFrame物件中每一列的唯一值和計數
原文:
df.head(n) | First n rows of the DataFrame df.tail(n) | Last n rows of the DataFrame df.shape | Number of rows and columns df.info() | Index, Datatype and Memory information df.describe() | Summary statistics for numerical columns s.value_counts(dropna=False) | View unique values and counts df.apply(pd.Series.value_counts) | Unique values and counts for all columns
6,資料選取
- df[col]:根據列名,並以Series的形式返回列
- df[[col1, col2]]:以DataFrame形式返回多列
- s.iloc[0]:按位置選取資料
- s.loc['index_one']:按索引選取資料
- df.iloc[0,:]:返回第一行
- df.iloc[0,0]:返回第一列的第一個元素
原文:
df[col] | Returns column with label col as Series df[[col1, col2]] | Returns columns as a new DataFrame s.iloc[0] | Selection by position s.loc['index_one'] | Selection by index df.iloc[0,:] | First row df.iloc[0,0] | First element of first column
7,資料清理
- df.columns = ['a','b','c']:重新命名列名
- pd.isnull():檢查DataFrame物件中的空值,並返回一個Boolean陣列
- pd.notnull():檢查DataFrame物件中的非空值,並返回一個Boolean陣列
- df.dropna():刪除所有包含空值的行
- df.dropna(axis=1):刪除所有包含空值的列
- df.dropna(axis=1,thresh=n):刪除所有小於n個非空值的行
- df.fillna(x):用x替換DataFrame物件中所有的空值
- s.astype(float):將Series中的資料型別更改為float型別
- s.replace(1,'one'):用‘one’代替所有等於1的值
- s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
- df.rename(columns=lambda x: x + 1):批量更改列名
- df.rename(columns={'old_name': 'new_ name'}):選擇性更改列名
- df.set_index('column_one'):更改索引列
- df.rename(index=lambda x: x + 1):批量重新命名索引
原文:
df.columns = ['a','b','c'] | Rename columns pd.isnull() | Checks for null Values, Returns Boolean Arrray pd.notnull() | Opposite of pd.isnull() df.dropna() | Drop all rows that contain null values df.dropna(axis=1) | Drop all columns that contain null values df.dropna(axis=1,thresh=n) | Drop all rows have have less than n non null values df.fillna(x) | Replace all null values with x s.fillna(s.mean()) | Replace all null values with the mean (mean can be replaced with almost any function from the statistics section) s.astype(float) | Convert the datatype of the series to float s.replace(1,'one') | Replace all values equal to 1 with 'one' s.replace([1,3],['one','three']) | Replace all 1 with 'one' and 3 with 'three' df.rename(columns=lambda x: x + 1) | Mass renaming of columns df.rename(columns={'old_name': 'new_ name'}) | Selective renaming df.set_index('column_one') | Change the index df.rename(index=lambda x: x + 1) | Mass renaming of index
8,資料處理:Filter,Sort和GroupBy
- df[df[col] > 0.5]:選擇col列的值大於0.5的行
- df.sort_values(col1):按照列col1排序資料,預設升序排列
- df.sort_values(col2, ascending=False):按照列col1降序排列資料
- df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,後按col2降序排列資料
- df.groupby(col):返回一個按列col進行分組的Groupby物件
- df.groupby([col1,col2]):返回一個按多列進行分組的Groupby物件
- df.groupby(col1)[col2]:返回按列col1進行分組後,列col2的均值
- df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):建立一個按列col1進行分組,並計算col2和col3的最大值的資料透視表
- df.groupby(col1).agg(np.mean):返回按列col1分組的所有列的均值
- data.apply(np.mean):對DataFrame中的每一列應用函式np.mean
- data.apply(np.max,axis=1):對DataFrame中的每一行應用函式np.max
原文:
df[df[col] > 0.5] | Rows where the column col is greater than 0.5 df[(df[col] > 0.5) & (df[col] < 0.7)] | Rows where 0.7 > col > 0.5 df.sort_values(col1) | Sort values by col1 in ascending order df.sort_values(col2,ascending=False) | Sort values by col2 in descending order df.sort_values([col1,col2],ascending=[True,False]) | Sort values by col1 in ascending order then col2 in descending order df.groupby(col) | Returns a groupby object for values from one column df.groupby([col1,col2]) | Returns groupby object for values from multiple columns df.groupby(col1)[col2] | Returns the mean of the values in col2, grouped by the values in col1 (mean can be replaced with almost any function from the statistics section) df.pivot_table(index=col1,values=[col2,col3],aggfunc=mean) | Create a pivot table that groups by col1 and calculates the mean of col2 and col3 df.groupby(col1).agg(np.mean) | Find the average across all columns for every unique col1 group df.apply(np.mean) | Apply the function np.mean() across each column nf.apply(np.max,axis=1) | Apply the function np.max() across each row
9,資料合併
- df1.append(df2):將df2中的行新增到df1的尾部
- df.concat([df1, df2],axis=1):將df2中的列新增到df1的尾部
- df1.join(df2,on=col1,how='inner'):對df1的列和df2的列執行SQL形式的join
原文:
df1.append(df2) | Add the rows in df1 to the end of df2 (columns should be identical) pd.concat([df1, df2],axis=1) | Add the columns in df1 to the end of df2 (rows should be identical) df1.join(df2,on=col1,how='inner') | SQL-style join the columns in df1 with the columns on df2 where the rows for col have identical values. how can be one of 'left', 'right', 'outer', 'inner'
10,資料統計
- df.describe():檢視資料值列的彙總統計
- df.mean():返回所有列的均值
- df.corr():返回列與列之間的相關係數
- df.count():返回每一列中的非空值的個數
- df.max():返回每一列的最大值
- df.min():返回每一列的最小值
- df.median():返回每一列的中位數
- df.std():返回每一列的標準差
原文:
df.describe() | Summary statistics for numerical columns df.mean() | Returns the mean of all columns df.corr() | Returns the correlation between columns in a DataFrame df.count() | Returns the number of non-null values in each DataFrame column df.max() | Returns the highest value in each column df.min() | Returns the lowest value in each column df.median() | Returns the median of each column df.std() | Returns the standard deviation of each column
參考http://wiki.jikexueyuan.com/project/start-learning-python/311.html
https://zhuanlan.zhihu.com/p/25630700
https://www.dataquest.io/blog/pandas-cheat-sheet/