背景
最近在項目處理數據時,對pandas里面的數據類型進行轉換時(astype),產生了一些意外的情況,經過研究,對數據框里面的數據類型,又有了新的認識,分享出來供大家參考學習。
創建模擬數據
模擬數據
- 假如模擬的數據如上圖所示,里面有一些空單元格,下面讀取模擬數據
import pandas as pd
import numpy as np
data=pd.read_excel('111.xlsx',sheet_name='astype')
data
讀取模擬數據
- 查看整體數據類型,可以看出所有的數據類型均為
object
,這里的object
對應的是python里面的str
字符類型
data.dtypes
數據類型
數據類型對應
- 查看
字段4
每一個數據是什么類型
for i in data['字段4']:
print(i,'\t',type(i))
每個數據類型
可以看出字段4
這一列里面,有str
、float
、int
三種數據類型,這里就可以看出一列里面數據類型可以不同,類似Excel一列,每個單元格可以存放不同類型的數據,和數據庫里面一列完全不一樣,數據庫里面一列數據類型在建表時,已聲明類型,只存放一種類型。但是上面在獲取整列數據類型時返回的是object
,用的是最大的數據類型,能囊括整列的數據類型
如果astype類型強制轉換
data['字段4_astype']=data['字段4'].astype('str')
data
for i in data['字段4_astype']:
print(i,'\t',type(i))
類型強制轉換
可以看出這里全部轉換為str
,NaN
也會強制轉換為字符型nan
,不再是np.nan
nan
這樣的話就出現一個問題,astype是強制把所有的類型都轉換為str
,而不忽略NaN
,要對非NAN進行轉換,就需要自定義函數來實現
自定義函數實現非NAN轉換類型
def astype_str_notna(df):
'''
傳入參數:數據框里面一列 Series
return:轉換后的一列 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()
自定義函數
通過自定義函數,可以實現數據類型轉換,而忽略NAN,從而達到在數據統計時,不會計算NAN
數據統計