最近發現周圍的很多小夥伴們都不太樂意使用pandas,轉而投向其他的數據操作庫,身為一個數據工作者,基本上是張口pandas,閉口pandas了,故而寫下此系列以讓更多的小夥伴們愛上pandas。
系列文章說明:
系列名(系列文章序號)——此次系列文章具體解決的需求
平台:
數據如下,需要將其中的浮點型數據轉換為整型數據。
df=pd.DataFrame({'A':[1.,2.,3.,None,np.nan,pd.NA,4.,5.,6.,7.,8.,9.],'B':[1.,2.,3.,None,None,None,4.,5.,6.,7.,8.,9.],'C':[1.,2.,3.,np.nan,np.nan,np.nan,4.,5.,6.,7.,8.,9.],'D':[1.,2.,3.,pd.NA,pd.NA,pd.NA,4.,5.,6.,7.,8.,9.],'E':[1.,2.,3.,0.0,0.0,0.0,4.,5.,6.,7.,8.,9.]})打印出樣式和各列的類型,看出圈出的兩列數據發生了微妙的改變,None在浮點型數據叢中自動轉換成了np.nan,而pd.NA以<NA>顯示,列類型除[0, 3]列外都是float64,似乎是pd.NA讓列類型變化了。

眾所周知,在python中的numpy模塊,獨自闖出了一片天地,很多關於數據處理,科學計算,機器學習的模塊會使用numpy模塊,而其中的numpy.nan(以下稱為np.nan)多多少少帶點迷惑性,在python中空值使用None填充,而在更多的數據科學中使用的是np.nan,更令人奇怪的是np.nan是浮點型數據,在pandas模塊為了解決這種情形,也設置了一個空類型屬性`pandas.NA(以下稱為pd.NA),在pandas中能夠更好的適應數據的變化。
>>>None==NoneTrue>>>type(np.nan)float>>>np.nan==np.nanFalse>>>type(pd.NA)pandas._libs.missing.NAType>>>pd.NA==pd.NA<NA>在這一例中,因為np.nan在數據列中是無法進行整型化,一種是可以將數據框轉化為二維列表再遍歷其中的列表將所有浮點數轉換,另一種則是將np.nan轉換為pd.NA,適應pandas結構,再轉換各自的列。
可能注意到,上述沒有提及None,None是一個隨性的值,當有pd.NA存在時保持本性,而沒有時就會隨列類型變化,如B列中的None。
/ 需求處理在pandas里有幾種方法可以轉換數據類型,這裡試用一些方法,將每列都轉換成int類型:
每列都操作完後,幾乎全軍覆沒,除了E列中所有的數都是有效數字外可以完成目標,其他的都發生了報錯,報錯原因基本都是int這個函數不能轉換空值或者無效值。
map(int)執行效果與上一個方法一樣。但在pandas.map里可以使用函數,對每個值進行判斷如果是空值則返回pd.NA,否則轉換為int類型。
>>>df['A'].map(lambdax:pd.NAifpd.isna(x)elseint(x))0112233<NA>4<NA>5<NA>64758697108119Name:A,dtype:object後續的幾列都能夠完成轉換,雖然類型轉為了object,通過值判斷可以確定已經將之前的浮點型數據轉換為整型了。
可能會想,使用pd.NA可以轉化成功,那麼使用np.nan呢,具體原因在前文已經說明,不再贅述,可以自行測試。
(手動水印:原創CSDN宿者朽命,https://blog.csdn.net/weixin_46281427?spm=1011.2124.3001.5343,公眾號A11Dot派)
pandas中的astype還可以轉換為pandas中的Int64Dtype類型,注意astype中的大小寫,其中的數字為整型,空值為pd.NA。轉換效果與map(lambda x: ...)一樣,不同處是列類型,這裡為Int64Dtype,該類型可能在後續操作會有部分限制。
>>>df['A'].astype('Int64')0112233<NA>4<NA>5<NA>64758697108119Name:A,dtype:Int64>>>df['C'].astype('Int64')/ 總結簡單的介紹了在數據框中包含空值,且需要將其中的浮點型數據轉換為整型數據如何處理,因為在numpy中定義nan為浮點型數據,比通常的浮點型數據,如1.1之類的有多了些特性,在pandas中的部分操作中可能無法滿足自身要求,這時不妨試試pandas中pd.NA來代替np.nan的使用,在平平凡凡的數據里也有多樣的天空。
道可道,非常道。
於二零二二年四月十五作