數據存在的形式多種多樣,如文件有 csv、Excel、txt 格式,數據庫有 MySQL、Access、SQL Server 等形式。數據庫
read_table 函數,導入 txt 文件,格式以下:數組
read_table(file, names=[列名1,列名2,...], spe = "", ...)
其中,file 爲文件路徑與文件名;數據結構
names 爲列名,默認爲文件中的第一行做爲列名;dom
sep 爲分隔符,默認爲空。函數
注意:(1)txt 文本文件要保存成 UTF-8 格式纔不會報錯;spa
(2)查看數據框 df 前 n 項數據使用 df.head(n) ;後 m 項數據用 df.tail(m) 。默認均是 5 項數據。excel
read_csv 函數,導入 csv 文件,格式以下:code
read_csv(file, names=[列名1,列名2,...], spe = "", ...)
其中,file 爲文件路徑與文件名;blog
names 爲列名,默認爲文件中的第一行做爲列名;索引
sep 爲分隔符,默認爲空,表示默認導入爲第一列。
read_excel 函數,導入 Excel 文件,格式以下:
read_excel (file, sheetname, header = 0)
其中,file 爲文件路徑和文件名;
sheetname 爲 sheet 的名稱,如 sheet1 ;
header爲列名,默認爲 0(只接收布爾型數據 0 和 1),通常以文件的第一行做爲列名。
注意:(1)header 取 0 和 1 的差異,取 0 表示以文件第一行做爲表頭顯示,取 1 表示把文件第一行丟棄,不做爲表頭顯示。有時能夠跳過首行或者讀取多個表;
(2)sheetname 能夠指定爲讀取幾個 sheet ,sheet 數目從 0 開始,如 sheetname=[0,2],則表明讀取第 1 頁和第 3 頁的 sheet;skiprows=[0] 表明讀取時跳過第 1 行。
to_csv函數,,導出csv文件,其格式以下:
to_csv (file _path, sep=",", index=TRUE, header=TRUE)
其中,file_path爲文件路徑;
sep爲分隔符,默認是逗號;
index表示是否導出行序號,默認是TRUE,導出行序號;
header表示是否導出列名,默認是TRUE,導出列名。
to_excel 函數,導出 Excel 文件,其格式以下:
to_excel (file _path, index=TRUE, header=TRUE)
其中,file_path爲文件路徑;
index表示是否導出行序號,默認是TRUE,導出行序號;
header表示是否導出列名,默認是TRUE,導出列名。
數據處理的主要內容包括數據清洗、數據抽取、數據交換和數據計算等。
數據清洗是數據價值鏈中最爲關鍵的步驟,數據清洗就是處理缺失數據以及清除無心義的信息,如刪除原始數據中的無關數據、重複數據等。
在Pandas模塊中去掉重複的數據,步驟以下:
(1)利用 DataFrame 中的 duplicated 方法,返回一個布爾型的 Series,顯示是否有重複行,沒有重複的行顯示爲 FALSE,有重複的行則從第二行起均顯示爲 TRUE;
(2)再利用 DataFrame 中的 drop_duplicates 方法返回一個移除了重複行的 DataFrame。
duplicated 方法以下:
duplicated(self, subset=None, keep='first')
其中,subset 用於識別重複的列標籤或列標籤序列,默認全部列標籤;
keep= 'fist' 表示除了第一次出現外,其他相同的數據被標記爲重複;
keep = 'last' 表示除了最後一次出現外,其他相同的數據被標記爲重複;
keep= False表示全部相同的數據都被標記爲重複。
若是 duplicated 方法和 drop_ duplicates 方法中沒有設置參數,則這兩個方法默認判斷所有列;若是在這兩個方法中加入了指定的屬性名(或者稱爲列名),例如 fame.drop_ dup licates(['state']),則指定部分列( state列)進行重複項的判斷。
drop_ duplicates 方法用於把數據結構中行相同的數據去除(保留其中的一行)。
代碼示例以下:
In [1]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df Out[1]: age name 0 26 Ben 1 85 John 2 64 Jerry 3 85 John 4 85 John In [2]: df.duplicated() Out[2]: 0 False 1 False 2 False 3 True 4 True dtype: bool In[3]: df.duplicated('name') out[3]: 0 False 1 False 2 False 3 True 4 True dtype: bool In[4]: df.drop_duplicates('age') out[4]: age name 0 26 Ben 1 85 John 2 64 Jerry
缺失值的處理包括如下兩個步驟:
(1)缺失數據的識別
Pandas 使用浮點值 NaN 表示浮點和非浮點數組裏的缺失數據,並使用 .isnull 和 .notnull 函數來判斷缺失狀況。
In [1]: from pandas import DataFrame from pandas import read_excel df = read_excel(r'c:\Users\test\test.xisx', sheetname = 'Sheet2') df Out[1]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 NaN 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 NaN 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46 In[2]: df.isnull() Out[2]: 學號 姓名 英語 數分 高代 解幾 0 False False False False False False 1 False False False False False False 2 False False False True False False 3 False False False False False False 4 False False False False False False 5 False False False False False False 6 False False False False False False 7 False False False False True False 8 False False False False False False 9 False False False False False False In[3]: df.notnull() Out[3]: 學號 姓名 英語 數分 高代 解幾 0 True True True True True True 1 True True True True True True 2 True True True False True True 3 True True True True True True 4 True True True True True True 5 True True True True True True 6 True True True True True True 7 True True True True False True 8 True True True True True True 9 True True True True True True
(2)缺失數據的處理
對於缺失數據的處理方式有如下幾種:
① dropna():去除數據結構中值爲空的數據行;
In [4]:newDF = df.dropna() newDF Out[4]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
② df.fillna():用其餘數據值代替 NaN,有事直接刪除空數據會影響分析結果,所以能夠對數據進行補充;
In [5]: df.fillna('?') Out[5]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 ? 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 ? 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
③ df.fillna(methon='pad'):用前一個數據值代替 NaN ;
In [6]: df.fillna(method='pad') Out[6]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 47.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 65.0 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
④ df.fillna(method='bfill'):用後一個數據值代替 NaN ;
In [7]: df.fillna(method='bfill') Out[7]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 72.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 61.0 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑤ df.fillna(df.mean()):用平均值或者其餘描述性統計量來代替 NaN ;
In [8]: df.fillna(df.mean()) Out[8]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 60.778 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 52.556 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑥ df.fillna(df.mean()['填補列名':'計算均值的列名']):可使用選擇列的均值進行缺失值的處理 ;
In [9]: df.fillna(df.mean()['高代':'解幾']) Out[9]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 NaN 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 52.556 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑦ df.fillna({'列名1':值1, '列名2':值2}):能夠傳入一個字典,對不一樣的列填充不一樣的值;
In [10]: df.fillna({'數分':100 , '高代':0 }) Out[10]: 學號 姓名 英語 數分 高代 解幾 0 2308024241 成龍 76 40.0 23.0 60 1 2308024244 周怡 66 47.0 47.0 44 2 2308024251 張波 85 100.0 45.0 60 3 2308024249 朱浩 65 72.0 62.0 71 4 2308024219 封印 73 61.0 47.0 46 5 2308024201 退培 60 71.0 76.0 71 6 2308024347 李華 67 61.0 65.0 78 7 2308024307 陳田 76 69.0 0.0 69 8 2308024326 餘皓 66 65.0 61.0 71 9 2308024219 封印 73 61.0 47.0 46
⑧ strip():清除字符型數據左右(首尾)指定的字符,默認爲空格,中間的不清除。
In [11]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df Out[11]: age name 0 26 Ben 1 85 John 2 64 Jerry 3 85 John 4 85 John In[12]:df['name'].str.strip() Out[12]: 0 Ben 1 John 2 Jerry 3 John 4 John Name: name, dtype: object
抽出某列上指定位置的數據作成新的列,格式以下:
slice (start, stop)
其中,start 表示開始位置,stop 表示結束位置。
按指定的字符 sep ,拆分已有的字符串,格式以下:
split(sep , n , expand = False)
其中,sep 表示用於分割字符串的分隔符;n 表示分割後新增的列數; expand 表示是否展開爲數據框,默認爲 FALSE ,返回 Series,若爲 TRUE,返回 DataFrame。
指定某列爲索引,以便於對其餘數據進行操做,格式以下:
df.set_index('列名')
示例代碼以下:
In [1]: from pandas import DataFrame from pandas import Series df = DataFrame(({'age': Series([26,85,64,85,85]),'name': Series(['Ben','John','Jerry",'John','John'])}) df1 = df.set_index('name') df1 Out[1]: name age Ben 26 John 85 Jerry 64 John 85 John 85 In[2]: df1.ix['John'] #ix函數是指經過行標籤或者行號索引行數據,相似還有 loc、iloc等。 Out[2]: name age John 85 John 85 John 85
根據必定條件,對數據進行抽取,格式以下:
df[condition]
其中,condition 表示過濾條件,返回值爲 DataFrame ,常見的 condition 類型有:比較運算、範圍運算、空置運算、字符匹配和邏輯運算等。
隨機從數據中按照必定的行數或者比例抽取數據,格式以下:
numpy.random.randint(start , end , num)
其中,參數分別表示範圍開始值、結束值、抽樣個數。返回值爲行的索引值序列。
代碼示例以下:
In[1]: from pandas import read_excel df = read_excel(r'C:\Users\test\test4.xls) df.head() Out[1]: 學號 電話 0 2308024241 18922254812 1 2308024244 13522255003 2 2308024251 13422259938 3 2308024249 18822256753 4 2308024219 18922253721 In[2]: r = numpy.random.randint(0,3,2) Out[2]: 學號 電話 0 2308024241 18922254812 3 2308024249 18822256753
(1)使用索引名(標籤)選取數據:df.loc[行標籤 , 列標籤]
df.loc 的第一個參數爲行標籤,第二個參數爲列標籤(可選,默認全部列標籤),兩個參數既能夠是列表也能夠是單個字符,若是兩個參數都爲列表,則返回 DataFrame ,不然爲 Series 。當同時抽取多行時,行的索引必須是列表的形式,而不能簡單地用逗號分隔。
(2)使用索引號選取數據:df.loc[行索引號,列索引號]
值將字典數據抽取爲 DataFrame,有以下三種方法:
(1)字典的 key 和 value 各做爲一列,示例代碼以下:
In[1]: import pandas from pandas import DataFrame d1 = {'a':'[1,2,3]' , 'b':'[0,1,2]'} a1 = pandas.DataFrame.from_dict(d1, orient = 'index') #將字典轉化爲 DataFrame,且key 列作成了 index a1.index.name = 'key' #將 index 的列名改成 'key' b1 = a1.reset_index() #從新增長 index,並將原 index 作成了 'key'列 b1.columns = ['key' , 'value'] #對列從新命名爲 'key' 和 'value' b1 Out[1]: key value 0 b [0,1,2] 1 a [1,2,3]
(2)字典裏的每個元素做爲一列(同長),示例代碼以下:
In[2]:d2 = {'a':'[1,2,3]' , 'b':'[0,1,2]'} #字典的 value 必須長度相等 a2 = DataFame(d2) a2 Out[2]: a b 0 1 4 1 2 5 2 3 6
(3)字典裏的每個元素做爲一列(不一樣長),示例代碼以下:
In[3]: d = {'one' : pandas.Series([1,2,3]) , 'two' : pandas.Series([1,2,3,4])} #字典的 value 必須長度能夠不等 df = pandas.DataFrame(d) df Out[3]: one two 0 1.0 1 1 2.0 2 2 3.0 3 3 NaN 4
--------------------------------------------
這裏暫時只講到數據導入、數據導出、數據清洗、數據抽取,後面將會講到的還有數據處理的其餘部分,如:插入記錄、修改記錄等。