官术网_书友最值得收藏!

1.3 Python數據處理工具之Pandas

Pandas最核心的兩個數據結構是一維的Series和二維的DataFrame, Series是帶有標簽的同構類型數組,而DataFrame是一個二維的表結構。在同構類型的數據中,一個DataFrame可以看作是由多個Series組成的。

1.3.1 數據讀取和存儲

Pandas是處理結構化數據非常重要的一個工具,其功能強大且好用。Pandas可以從CSV、JSON、Text等格式文件中讀取數據,本節講解CSV、JSON格式數據的讀取和存儲。

1. CSV文件的讀取和存儲

對CSV文件進行操作有兩個接口(API),分別是read_csv和to_csv。

(1)API:read_csv

read_csv()是用來讀取CSV文件的接口,其具有豐富的參數,可以配置來滿足實際的數據讀取需要。下面介紹一些關鍵的且常用的參數。

· filepath_or_buffer:配置所需讀取CSV文件的路徑。

· sep:配置CSV文件的列分隔符,默認是逗號“, ”。

· delimiter:可選配置,作為sep配置分隔符的別名。

· delim_whitespace:配置是否用空格來作為列分隔符。如果設置為True,那么sep配置參數就不起作用了。

· header:配置用行數來作為列名,默認配置成自動推斷。

· names:配置列名,如果所讀取的CSV文件沒有表頭,那么需要配置header=None,否則會將第一行數據作為對應的列名。

· usecols:當只需要讀取CSV文件中的部分數據時,可以使用usecols來指定讀取列名以獲取數據。

· dtype:配置所讀取數據的類型。

· encoding:配置文件的編碼方式,一般使用UTF-8或者GBK。

(2)API:to_csv

to_csv()用于將數據保存到CSV文件中。其參數比較多,如下所示,但只有第一個參數是必需的。

· path_or_buf:配置CSV文件的保存路徑。

· sep:配置保存文件的分隔符,默認是逗號“, ”。

· na_rep:配置空值補全的值,默認用空格代替。

· float_format:配置將浮點數格式化成字符串類型。

· columns:配置需要寫入列的列名,如果不配置,則默認從第1列開始寫入。

· header:配置是否寫入列名,默認是需要寫的。

· index:配置是否寫入行名,默認是需要寫的。

· index_label:配置用來作為列索引的列,默認是沒有的。

· mode:配置寫入模式,默認是W。

· encoding:配置編碼格式,該配置只針對Python 3以前的版本。

· line_terminator:配置每行的結束符,默認使用“\n”。

· quotin:配置CSV的引用規則。

· quotechar:配置用來作為引用的字符,默認是空格。

· chunksize:配置每次寫入的行數。

· tuplesize_cols:配置寫入list的格式,默認以元組的方式寫入。

· date_format:配置時間數據的格式。

2. JSON文件的讀取和存儲

對JOSN文件進行操作有兩個API,分別是read_json和to_json。

(1)API:read_json()

read_json()是用于讀取JSON文件或者返回JSON數據的接口。日常需要用到的配置參數如下。

· filepath_or_buffer:配置有效的JSON字符串、JSON文件的路徑或者數據接口。數據接口可以是一個URL地址。

· type:配置將讀取的數據生成Series還是DataFrame,默認是DataFrame。

(2)API:to_json()

to_json()用于將數據保存為JSON格式。日常需要用到的配置參數如下。

· path_or_buf:配置JSON數據保存的路徑或者寫入的內存區域。

· date_format:配置時間數據的格式,epoch表示配置成時間戳的格式,iso表示配置成ISO 8601的格式。

· double_precision:配置小數點后保留的位數,默認是10位。

· force_ascii:配置是否強制將String轉碼成ASCII,默認強制進行轉碼。

· date_unit:配置時間數據的格式,可以實現精確到秒級或毫秒級。

1.3.2 數據查看和選取

Pandas的數據對象有Series、DataFrame和Panel,常用的數據類型是一維的Series和二維的DataFrame。DataFrame擁有非常豐富的API,能夠滿足我們對數據選取和處理的需求。

1.查看數據

(1)df.shape

df.shape用于查看數據的維度。由于DataFrame是二維的,因此df.shape的返回值包含兩個元素,df.shape[0]返回的是行數,df.shape[1]返回的是列數。示例代碼如下:

        1.  >>> import pandas as pd
        2.  >>> dict={'cpu':'8c', 'memory':'64G'}
        3.  >>> df=pd.DataFrame(dict, index=[0])
        4.  >>> df.shape[0]
        5.  1
        6.  >>> df.shape[1]
        7.  2

(2)df.head()

df.head()默認返回DataFrame數據的前5行,如果需要查看更多的行數,則只要傳參進去即可。df.tail()默認返回數據的后5行,想要查看更多的數據同樣可以傳參進去。查看數據的匯總統計可以使用df.describe(),查看數據概況可以使用df.info。示例代碼如下:

        1.  >>> import pandas as pd
        2.  >>>dict=[{'cpu':'8c', 'memory':'64G'}, {'cpu':'12c', 'memory':'64G'}]
        3.  >>> df=pd.DataFrame(dict, index=[0,0])
        4.  >>> df.head(2) #查看前兩行數據
        5.     cpu memory
        6.  0   8c   64G
        7.  0  12c   64G
        8.  >>> df.tail(1) #查看最后一行數據
        9.     cpu memory
        10. 0  12c   64G
        11. >>> df.describe() #查看數據的匯總統計
        12.        cpu memory
        13. count    2     2
        14. unique   2     1
        15. top    12c   64G
        16. freq     1     2
        17. >>> df.info() #查看數據概況
        18. <class 'pandas.core.frame.DataFrame'>
        19. Int64Index: 2 entries, 0 to 0
        20. Data columns (total 2 columns):
        21. cpu      2 non-null object
        22. memory   2 non-null object
        23. dtypes: object(2)
        24. memory usage: 48.0+ bytes

想要查看列名可以使用df.columns(),查看各列的平均值可以直接用df.mean()。

2.選取數據

在選取數據時,既可以使用列名來選取,也可以使用索引來選取。如果要查看某列的數據,則可以用df[col_name]或者df.col_name,當查看多列時可以將多列的列名作為一個數組傳參進去,如df[[col1, col2]]。使用索引來選取數據,則要用到df.iloc。大家要注意df.loc和df.iloc在使用上是有區別的,df.loc傳遞的是索引的名稱,df.iloc傳遞的是索引的相對位置,我們常用的是df.iloc。示例代碼如下:

        1.  >>> df.iloc[1] #iloc是取的索引的相對位置,即DataFrame的第二行元素
        2.  cpu      12c
        3.  memory   64G
        4.  Name: 0, dtype: object
        5.  >>> df.loc[0] #loc是取的行索引的名稱
        6.     cpu memory
        7.  0   8c   64G
        8.  0  12c   64G
        9.  >>> df['memory'] #通過列名查看數據
        10. 0   64G
        11. 0   64G
        12. Name: memory, dtype: object
        13. >>> df.cpu #通過列名查看數據,使用的是“.”訪問方式
        14. 0    8c
        15. 0   12c

1.3.3 數據處理

Pandas DataFrame提供了豐富的數據處理方法,為我們進行必要的數據操作和預處理提供了非常大的幫助。下面我們來看看常用的數據處理方法。

1.數據合并

在進行數據預處理時,需要進行必要的數據合并操作,將分散的數據或者部分數據整合到一起進行神經網絡模型訓練。DataFrame提供了多個數據拼接的方法,使用pd.concat()可以直接放到數組中按行拼接,也可以使用pd.merge()按列拼接,或者使用df.append()增加某列數據。示例代碼如下:

        1.  >>> df
        2.     cpu memory
        3.  0   8c   64G
        4.  0  12c   64G
        5.  >>> pie=[df, df]
        6.  >>>df2=pd.concat(pie) #按行拼接,也就是說,數據在行的方向上進行增加
        7.  >>> df2
        8.     cpu memory
        9.  0   8c   64G
        10. 0  12c   64G
        11. 0   8c   64G
        12. 0  12c   64G
        13. >>> df3=pd.merge(df2, df, on='cpu') #按列cpu進行拼接。我們發現會在拼接
            后的df3中增加一列,且列名變成了memory_x, memory_y
        14. >>> df3
        15.    cpu memory_x memory_y
        16. 0   8c     64G     64G
        17. 1   8c     64G     64G
        18. 2  12c     64G     64G
        19. 3  12c     64G     64G

2.數據清理

在使用DataFrame進行數據處理時,如果數據質量不高,則需要清理一些空值或者進行空值補全。

我們可以使用df3.isnull()檢查數據是否為空值,使用df3.isnull().sum()進行空值的統計。如果需要對空值進行補全,則可以使用df3.fillna(n), n值就是替換空值的值。如果想要去掉所有帶有空值的數據,則可以使用df3.dropna()刪除包含空值的行和列,默認刪除包含空值的行。df3.dropna(axis=1)會刪除包含空值的列。示例代碼如下:

        1.  >>> df3
        2.     cpu memory_x memory_y
        3.  0   8c     64G     64G
        4.  1   8c     64G    None
        5.  2  12c     64G     64G
        6.  3  12c     64G     64G
        7.  >>> df3.isnull()#判斷df3中為空值的元素,返回的是整個df3的空值判斷結果分布
        8.      cpu  memory_x  memory_y
        9.  0  False    False    False
        10. 1  False    False     True
        11. 2  False    False    False
        12. 3  False    False    False
        13. >>> df3.isnull().sum()#統計df3中空值元素的個數,返回的是按列統計結果
        14. cpu        0
        15. memory_x   0
        16. memory_y   1
        17. dtype: int64
        18.
        19. >>> df3.fillna('32G') #對df3中的空值元素用32G進行空值補全。注意,這
            里的補全只是對返回結果的補全,對df3中的原始空值并不改變,這個同樣適用
            于df3.fillna()和df3.dropna()
        20.    cpu memory_x memory_y
        21. 0   8c     64G     64G
        22. 1   8c     64G     32G
        23. 2  12c     64G     64G
        24. 3  12c     64G     64G
        25. >>> df3 #可以看到df3中的空值并沒有改變
        26.    cpu memory_x memory_y
        27. 0   8c     64G     64G
        28. 1   8c     64G    None
        29. 2  12c     64G     64G
        30. 3  12c     64G     64G
        31. >>> df3.dropna()
        32.    cpu memory_x memory_y
        33. 0   8c     64G     64G
        34. 2  12c     64G     64G
        35. 3  12c     64G     64G
        36. >>> df3.dropna(axis=1)
        37.    cpu memory_x
        38. 0   8c     64G
        39. 1   8c     64G
        40. 2  12c     64G
        41. 3  12c     64G

3.數據處理

在進行數據處理時,我們還會遇到諸如轉換數據類型、統計唯一值的個數以及序列排序等需求。DataFrame也提供了一些對應的操作方法供使用,比如,轉換數據類型可以使用df3.astype(),統計唯一值的個數可以使用df3.columns.value_counts(),序列排序可以使用df3.sort_values(by= colname, ascending=True)。示例代碼如下:

        1.  >>> df3
        2.     cpu memory_x memory_y
        3.  0   8     64G     64G
        4.  1   8     64G    None
        5.  2   8     64G     64G
        6.  3   8     64G     64G
        7.  >>> df3['cpu'].astype(float) #對指定列進行數據類型轉換,將cpu列的類型
            從int轉換為float。如df3.fillna()一樣,這個操作并不會改變df3中的原始值,
            而是將df3復制了一份進行相應的數據轉換后返回
        8.  0   8.0
        9.  1   8.0
        10. 2   8.0
        11. 3   8.0
        12. Name: cpu, dtype: float64
        13. >>> df3.columns.value_counts()#對df3中的唯一值進行統計,按列返回統計結果
        14. memory_x   1
        15. memory_y   1
        16. cpu        1
        17. dtype: int64
        18. >>> df3
        19.    cpu memory_x memory_y
        20. 0   8     64G     64G
        21. 1   12     64G    None
        22. 2   8     64G     64G
        23. 3   8     64G     64G
        24. >>> df3.sort_values(by='cpu', ascending=True) #按照cpu列的元素值大小
            升序排列
        25.    cpu memory_x memory_y
        26. 0   8     64G     64G
        27. 2   8     64G     64G
        28. 3   8     64G     64G
        29. 1   12     64G    None
主站蜘蛛池模板: 苍南县| 淮阳县| 海门市| 宽甸| 搜索| 河间市| 章丘市| 枝江市| 新兴县| 三台县| 壤塘县| 双桥区| 西平县| 五大连池市| 武汉市| 漳浦县| 柳河县| 汉沽区| 保定市| 玛纳斯县| 皋兰县| 鲁甸县| 敦煌市| 聂拉木县| 无棣县| 根河市| 蓬溪县| 柳河县| 会理县| 宿迁市| 苗栗县| 伊春市| 汕头市| 丰原市| 塘沽区| 双鸭山市| 新丰县| 饶阳县| 嘉兴市| 丽水市| 卢湾区|