背景
最近在項(xiàng)目處理數(shù)據(jù)時(shí)拆座,對pandas里面的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換時(shí)(astype),產(chǎn)生了一些意外的情況冠息,經(jīng)過研究挪凑,對數(shù)據(jù)框里面的數(shù)據(jù)類型,又有了新的認(rèn)識逛艰,分享出來供大家參考學(xué)習(xí)躏碳。
創(chuàng)建模擬數(shù)據(jù)
- 假如模擬的數(shù)據(jù)如上圖所示,里面有一些空單元格散怖,下面讀取模擬數(shù)據(jù)
import pandas as pd
import numpy as np
data=pd.read_excel('111.xlsx',sheet_name='astype')
data
- 查看整體數(shù)據(jù)類型菇绵,可以看出所有的數(shù)據(jù)類型均為
object
肄渗,這里的object
對應(yīng)的是python里面的str
字符類型
data.dtypes
- 查看
字段4
每一個(gè)數(shù)據(jù)是什么類型
for i in data['字段4']:
print(i,'\t',type(i))
可以看出字段4
這一列里面,有str
脸甘、float
恳啥、int
三種數(shù)據(jù)類型,這里就可以看出一列里面數(shù)據(jù)類型可以不同丹诀,類似Excel一列钝的,每個(gè)單元格可以存放不同類型的數(shù)據(jù),和數(shù)據(jù)庫里面一列完全不一樣铆遭,數(shù)據(jù)庫里面一列數(shù)據(jù)類型在建表時(shí)硝桩,已聲明類型,只存放一種類型枚荣。但是上面在獲取整列數(shù)據(jù)類型時(shí)返回的是object
碗脊,用的是最大的數(shù)據(jù)類型,能囊括整列的數(shù)據(jù)類型
如果astype類型強(qiáng)制轉(zhuǎn)換
data['字段4_astype']=data['字段4'].astype('str')
data
for i in data['字段4_astype']:
print(i,'\t',type(i))
可以看出這里全部轉(zhuǎn)換為str
橄妆,NaN
也會強(qiáng)制轉(zhuǎn)換為字符型nan
衙伶,不再是np.nan
這樣的話就出現(xiàn)一個(gè)問題,astype是強(qiáng)制把所有的類型都轉(zhuǎn)換為str
害碾,而不忽略NaN
矢劲,要對非NAN進(jìn)行轉(zhuǎn)換,就需要自定義函數(shù)來實(shí)現(xiàn)
自定義函數(shù)實(shí)現(xiàn)非NAN轉(zhuǎn)換類型
def astype_str_notna(df):
'''
傳入?yún)?shù):數(shù)據(jù)框里面一列 Series
return:轉(zhuǎn)換后的一列 Series
'''
t=[]
for i in df:
if type(i)== float:
if not np.isnan(i):
i=str(int(i))
if type(i)== int:
i=str(i)
t.append(i)
return pd.Series(t)
data['字段4_def']=astype_str_notna(data['字段4'])
data
data['字段4'].isna()
通過自定義函數(shù)慌随,可以實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換芬沉,而忽略NAN,從而達(dá)到在數(shù)據(jù)統(tǒng)計(jì)時(shí)阁猜,不會計(jì)算NAN