大家好,我是才哥。
今天介紹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:列表,需要排除的數據類型,同上。
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')


數字轉字符類型非常簡單,可以簡單的使用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方法也會同步更新,並支持新的變量類型。
今日封面: