- 走向TensorFlow 2.0:深度學習應用編程快速入門
- 趙英俊
- 2931字
- 2020-04-03 12:56:47
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
- Learning Neo4j
- Node.js Design Patterns
- Mastering JavaScript Object-Oriented Programming
- What's New in TensorFlow 2.0
- 軟件測試項目實戰之性能測試篇
- MATLAB應用與實驗教程
- Amazon S3 Cookbook
- EPLAN實戰設計
- 小學生C++創意編程(視頻教學版)
- Learning Unity 2D Game Development by Example
- 精通MATLAB(第3版)
- Swift語言實戰晉級
- BeagleBone Robotic Projects(Second Edition)
- Go語言從入門到精通
- Instant Apache Camel Messaging System