close

大家好,我是才哥。

今天介紹pandas 變量類型轉換的 6 種方法

所有數據和代碼可在我的GitHub獲取:

https://github.com/xiaoyusmd/PythonDataScience

一、變量類型及轉換

對於變量的數據類型而言,Pandas除了數值型的int 和 float類型外,還有object ,category,bool,datetime類型。

另外,空值類型作為一種特殊類型,需要單獨處理,這個在pandas缺失值處理一文中已詳細介紹。

數據處理的過程中,經常需要將這些類型進行互相轉換,下面介紹一些變量類型轉換的常用方法。

1、查詢變量類型

在數據處理的過程中,針對不同的數據類型會有不同的處理方法,比如數值型可以做加減乘除,但是字符型、時間類型就需要其它處理方法。為此,我們首先需要將各種數據類型進行區分,然後再分別處理。

pandas中select_dtype函數可以特徵變量進行快速分類,具體用法如下:

DataFrame.select_dtypes(include=None,exclude=None)

include:列表,想要留下的數據類型,比如float64,int64,bool,object等

exclude:列表,需要排除的數據類型,同上。

df=pd.DataFrame({'a':[1,2]*3,'b':[True,False]*3,'c':[1.0,2.0]*3,'d':['a','b']*3})#篩選float和int的數值類型變量num_list=df.select_dtypes(include=['float','int64']).columns.tolist()#篩選ojbect字符型的數值類型變量obj_list=df.select_dtypes(include=['object']).columns.tolist()print(obj_list)print(num_list)>>['d']>>['a','c']

include和exclude也可以組合使用篩選。

如果想要查看所有變量的數據類型,可以通過info快速查看,如下:

df.info()>><class'pandas.core.frame.DataFrame'>RangeIndex:6entries,0to5Datacolumns(total4columns):#ColumnNon-NullCountDtype----------------------------0a6non-nullint641b6non-nullbool2c6non-nullfloat643d6non-nullobjectdtypes:bool(1),float64(1),int64(1),object(1)memoryusage:278.0+bytes2、轉換數值類型

數值類型包括int和float。

轉換數據類型比較通用的方法可以用astype進行轉換。

pandas中有種非常便利的方法to_numeric()可以將其它數據類型轉換為數值類型。

pandas.to_numeric(arg, errors='raise', downcast=None)

arg:被轉換的變量,格式可以是list,tuple,1-d array,Series

errors:轉換時遇到錯誤的設置,ignore, raise, coerce,下面例子中具體講解

downcast:轉換類型降級設置,比如整型的有無符號signed/unsigned,和浮點float

下面例子中,s是一列數據,具有多種數據類型,現在想把它轉換為數值類型。

importpandasaspdimportnumpyasnps=pd.Series(['boy','1.0','2019-01-02',1,False,None,pd.Timestamp('2018-01-05')])#默認錯位格式為raise,遇到非數字字符串類型報錯pd.to_numeric(s,errors='raise')#錯位格式為ignore,只對數字字符串轉換,其他類型一律忽視不轉換,包含時間類型pd.to_numeric(s,errors='ignore')#將時間字符串和bool類型強制轉換為數字,其他均轉換為NaNpd.to_numeric(s,errors='coerce')#downcast可以進一步轉化為int或者floatpd.to_numeric(s)#默認float64類型pd.to_numeric(s,downcast='signed')#轉換為整型4、轉換字符類型

數字轉字符類型非常簡單,可以簡單的使用str直接轉換。

df=pd.DataFrame({'year':[2015,2016],'month':[2,3],'day':[4,5]})df['month']=df['month'].map(str)df.info()>><class'pandas.core.frame.DataFrame'>RangeIndex:2entries,0to1Datacolumns(total3columns):#ColumnNon-NullCountDtype----------------------------0year2non-nullint641month2non-nullobject2day2non-nullint64dtypes:int64(2),object(1)memoryusage:176.0+bytes

此外這裡再延伸一下,去掉字符類型的方法eval。

比如,當我們遇到'[1,2,3]'這種情況的時候,我們實際想獲取裡面的列表,但是現在卻是個字符串類型,我們可以使用eval函數將''這個外套直接去掉,去掉後自動轉換成裡面數據類型。

a='[1,2,3]'type(a)>>streval(a)>>[1,2,3]5、轉換時間類型

使用to_datetime函數將數據轉換為日期類型,用法如下:

pandas.to_datetime(arg,errors='raise',dayfirst=False,yearfirst=False,utc=None,box=True,format=None,exact=True,unit=None,infer_datetime_format=False,origin='unix')

參數比較多,常用的就是format,按照指定的字符串strftime格式解析日期,一般情況下該函數可以直接自動解析成日期類型。

#對整個dataframe轉換,將年月日幾列自動合併為日期df=pd.DataFrame({'year':[2015,2016],'month':[2,3],'day':[4,5]})df>>yearmonthday02015241201635pd.to_datetime(df)>>02015-02-0412016-03-05dtype:datetime64[ns]#對單列轉換日期類型df1=pd.DataFrame({'appl_tm':['20220401','20220402','20220403'],'appl_tm1':['2012.03.04','2021.09.04','2031.06.05']})>>df1appl_tmappl_tm10202204012012.03.041202204022021.09.042202204032031.06.05df1['appl_tm']=pd.to_datetime(df1['appl_tm'])df1['appl_tm1']=pd.to_datetime(df1['appl_tm1'],format='%Y.%m.%d')>>df1appl_tmappl_tm102022-04-012012-03-0412022-04-022021-09-0422022-04-032031-06-05

轉換為日期類型後,就可以對日期使用series.dt.方法進行更複雜的篩選和查詢了。

#篩選2021年的日期,month和day也是同理df1['appl_tm1'].dt.year==2021>>0False1True2FalseName:appl_tm1,dtype:booldf1[df1['appl_tm1'].dt.year==2021]>>appl_tmappl_tm112022-04-022021-09-046、轉換category類型

category類型在pandas中的出場率並不是很高,一般在不考慮優化效率時,會用其它類型替代。但如果需要轉換category類型,可以直接使用astype完成。

df=pd.DataFrame({'year':[2015,2016],'month':[2,3],'day':[4,5]})df['year']=df['year'].astype('category')df.info()>><class'pandas.core.frame.DataFrame'>RangeIndex:2entries,0to1Datacolumns(total3columns):#ColumnNon-NullCountDtype----------------------------0year2non-nullcategory1month2non-nullint642day2non-nullint64dtypes:category(1),int64(2)memoryusage:258.0byte

對於category類型的具體使用方法,可以參考這篇文章:category分類變量的使用方法

7、智能類型轉換convert_dtypes

上面介紹的均為手動一對一的變量類型轉換,pandas中還提供了一種智能轉換的方法convert_dtypes,使用它可以無腦自動完成轉換。

默認情況下,convert_dtypes將嘗試將Series或DataFrame中的每個Series轉換為支持的dtypes,它可以對Series和DataFrame都直接使用。

該方法的參數如下:

infer_objects:默認為True,是否應將對象dtypes轉換為最佳類型

convert_string:默認為True,對象dtype是否應轉換為StringDtype()

convert_integer:默認為True,如果可能,是否可以轉換為整數擴展類型

convert_boolean :默認為True,對象dtype是否應轉換為BooleanDtypes()

convert_floating :默認為True,如果可能,是否可以轉換為浮動擴展類型。如果convert_integer也為True,則如果可以將浮點數忠實地轉換為整數,則將優先考慮整數dtype

下面看一組示例。

通過結果可以看到,變量都是是創建時默認的類型。但其實變量是有整數、字符串、布爾的,其中有的還存在空值。

#對整個dataframe直接轉換>>>dfn=df.convert_dtypes()>>>dfnabcdef01xTrueh10<NA>12yFalsei<NA>100.523z<NA><NA>20200.0>>>dfn.dtypesaInt32bstringcbooleandstringeInt64fFloat64dtype:object

忽略了空值的影響,變量類型已經自動轉換為我們想要的了。

對Series的轉換也是一樣的。下面的Seires中由於存在nan空值所以類型為object。

#Series變量類型轉換s=pd.Series(["a","b",np.nan])>>>s0a1b2NaNdtype:object#通過convert_dtypes成功轉換為String>>>s.convert_dtypes()0a1b2<NA>dtype:string

如果未來增加了新類型,convert_dtypes方法也會同步更新,並支持新的變量類型。

今日封面:

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()