數據分析------數據處理(1)

一、數據導入

   數據存在的形式多種多樣,如文件有 csv、Excel、txt 格式,數據庫有 MySQL、Access、SQL Server 等形式。數據庫

1.1 導入 txt 文件

   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

 1.2 導入 csv 文件

   read_csv 函數,導入 csv 文件,格式以下:code

read_csv(file, names=[列名1,列名2,...], spe = "", ...)

  其中,file 爲文件路徑與文件名;blog

     names 爲列名,默認爲文件中的第一行做爲列名;索引

     sep 爲分隔符,默認爲空,表示默認導入爲第一列。

 1.3 導入 Excel 文件

  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 行。

 

二、數據導出

2.1 導出 csv 文件

  to_csv函數,,導出csv文件,其格式以下:

to_csv (file _path, sep=",", index=TRUE, header=TRUE)

  其中,file_path爲文件路徑;

     sep爲分隔符,默認是逗號;

     index表示是否導出行序號,默認是TRUE,導出行序號;

     header表示是否導出列名,默認是TRUE,導出列名。

2.2 導出 Excel 文件

  to_excel 函數,導出 Excel 文件,其格式以下:

to_excel (file _path,  index=TRUE, header=TRUE)

  其中,file_path爲文件路徑;

     index表示是否導出行序號,默認是TRUE,導出行序號;

     header表示是否導出列名,默認是TRUE,導出列名。

 

三、數據清洗

  數據處理的主要內容包括數據清洗、數據抽取、數據交換和數據計算等。

  數據清洗是數據價值鏈中最爲關鍵的步驟,數據清洗就是處理缺失數據以及清除無心義的信息,如刪除原始數據中的無關數據、重複數據等。

3.1 重複值的處理

  在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           

3.2 缺失值處理

  缺失值的處理包括如下兩個步驟:

  (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

 四、數據抽取

4.1 字段抽取

  抽出某列上指定位置的數據作成新的列,格式以下:

slice (start, stop)

  其中,start 表示開始位置,stop 表示結束位置。

 4.2 字段拆分

  按指定的字符 sep ,拆分已有的字符串,格式以下:

split(sep , n , expand = False)

  其中,sep 表示用於分割字符串的分隔符;n 表示分割後新增的列數; expand 表示是否展開爲數據框,默認爲 FALSE ,返回 Series,若爲 TRUE,返回 DataFrame。

4.3 重置索引

  指定某列爲索引,以便於對其餘數據進行操做,格式以下:

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

4.4 記錄抽取

  根據必定條件,對數據進行抽取,格式以下:

df[condition]

  其中,condition 表示過濾條件,返回值爲 DataFrame ,常見的 condition 類型有:比較運算、範圍運算、空置運算、字符匹配和邏輯運算等。

4.5 隨機抽樣

  隨機從數據中按照必定的行數或者比例抽取數據,格式以下:

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

4.6 經過索引抽取數據

  (1)使用索引名(標籤)選取數據:df.loc[行標籤 , 列標籤]

  df.loc 的第一個參數爲行標籤,第二個參數爲列標籤(可選,默認全部列標籤),兩個參數既能夠是列表也能夠是單個字符,若是兩個參數都爲列表,則返回 DataFrame ,不然爲 Series 。當同時抽取多行時,行的索引必須是列表的形式,而不能簡單地用逗號分隔。

  (2)使用索引號選取數據:df.loc[行索引號,列索引號]

4.7 字典數據抽取

  值將字典數據抽取爲 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

--------------------------------------------

這裏暫時只講到數據導入、數據導出、數據清洗、數據抽取,後面將會講到的還有數據處理的其餘部分,如:插入記錄、修改記錄等。

相關文章
相關標籤/搜索