環境依賴:
mysql 5.7.17
python 2.7
mysql-python 1.2.5
pandas 0.18.1
資料型別轉化從以下兩個方面討論並分析:
由於資料缺失導致dataframe中int轉float型
由於數值型別字串導致從csv載入到dataframe時string轉numeric
基於python將mysql的表結構轉化為pandas的dataframe時,出現如下問題:
a)age列原本為int型別,但是在dataframe中轉化為float型別
b)對於sql中的none值在dataframe裡有多種表示方式。
資料來源資訊如下所示:
在dataframe中展示效果如下:
通過查閱官方文件得知,pandas在處理缺失值上,擁有乙個自己的處理及轉化邏輯;具體規則描述如下圖所示:
不難看出,當int型資料列包含空值時,會將該列轉化為float型別;個人理解(未必一定準確):在pandas中,對於數值型別的空值,是統一用nan來表示的;nan在pandas中是一種特殊的float值,而非大家所熟悉的空物件;因此對於int型別的空值,因無法表示相應的空值,所以需要先做資料型別的轉化,然後用nan來表示缺失值。
通過這個例子,在理解numeric型別轉化原因的同時,希望能提高對資料異常的情況的警惕性和敏感度;理解業務,實現邏輯的同時,準確有效的進行資料降噪,從而提公升資料的有效性和真實性。
空值分別在mysql、python、pandas上的表現形式如下表所示:
/字串空值
空字串數值型別空值
mysql
null
」null
python
none
」none
pandas
none
」nan
由於字串空值和空字串這兩種情況在寫到csv的效果完全一致,從而導致在讀取資料時,無法做區分。如果後續業務明確要求區分處理這兩種情況,則會因為一次讀寫檔案的操作導致資料失真。基於此原因,建議在業務線內,規定乙個唯一標識的字串來代表none值(參考數倉建設),從而有效區分字串空值和空字串的區別。
若某一列為數值字串時,通過pd.read_csv方法轉化為dataframe後,該列會被識別為numeric型別(eg: int, float),而非原本的string型別。eg:將前文中mysql資料表中的***列和password列的內容修改為純數值,資料集及各列對應的資料型別分別如下圖所示:
並將該表中的資料先寫到本地csv檔案;然後通過pd.read_csv讀取檔案資料時發現***列被識別為int型別,password列被識別為float型別。資料展示效果及各列對應的資料型別分別如下圖所示:
所以在基於pandas操作csv檔案時,需要特別注意這種情況。如果在後續的分析中,需要保留原始資料集中的資料型別,則在讀取csv檔案時,需要顯示的指定dtype引數,從而保證資料型別的前後統一。
通過上述案例分析,希望操作csv檔案時注意空字串和字串空值在具體專案中的實際意義,以免造成不必要的麻煩;以及潛在的資料型別轉化隱患。
Python資料分析之pandas讀取資料
1 csv檔案讀取 語法格式 pandas.read csv 檔案路徑 csv檔案內容如下 import pandas as pd file path e pandas study test.csv content pd.read csv file path content.head 預設返回前5行...
資料分析之Pandas
from pandas import series,dataframe import pandas as pd import numpy as np states california ohio oregon texas year 2000,2001,2002,2003 value 35000,71...
資料分析之pandas
pandas是基於numpy構建的庫,擁有兩種資料結構 series和dataframe series 就是一維陣列 dataframe 是二維陣列series in 1 from pandas import series,dataframe in 2 import pandas as pd in ...