基于DataFrame改变列类型的方法
今天用numpy的linalg.det()求矩阵的逆的过程中出现了一个错误:
TypeError:Noloopmatchingthespecifiedsignatureandcastingwasfoundforufuncdet
查了半天发现是数据类型的问题,numpy在算逆的时候会先检查一下数据类型是否一致,若不一致就会报错(话说这个错误提示信息也太难理解了,还得看源码o(╯□╰)o)。
由于我的数据是用pandas.DataFrame读取的,所以每一列的数据类型有可能不同。
回头检查一下数据,果然有的是int,有的是float。所以全部改为float64类型。
找到了如下的方法,以及DataFrame数据类型:
DataFrame类型转换方法—astype()
importpandasaspd df=pd.DataFrame([{'col1':'a','col2':'1'},{'col1':'b','col2':'2'}]) printdf.dtypes df['col2']=df['col2'].astype('int') print'-----------' printdf.dtypes df['col2']=df['col2'].astype('float64') print'-----------' printdf.dtypes
输出:
col1object col2object dtype:object ----------- col1object col2int32 dtype:object ----------- col1object col2float64 dtype:object
astype()也能一次改变所有数据的类型:
In[30]:a Out[31]: abcd 00.8913800.442167-0.5394501.023458 1-0.488131-1.847104-0.209799-0.768713 21.2904340.3270960.3584060.422209 In[32]:a.astype('int32') Out[32]: abcd 00001 10-100 21000
附:datatypelist
DatatypeDescription bool_Boolean(TrueorFalse)storedasabyte int_Defaultintegertype(sameasClong;normallyeitherint64orint32) intcIdenticaltoCint(normallyint32orint64) intpIntegerusedforindexing(sameasCssize_t;normallyeitherint32orint64) int8Byte(-128to127) int16Integer(-32768to32767) int32Integer(-2147483648to2147483647) int64Integer(-9223372036854775808to9223372036854775807) uint8Unsignedinteger(0to255) uint16Unsignedinteger(0to65535) uint32Unsignedinteger(0to4294967295) uint64Unsignedinteger(0to18446744073709551615) float_Shorthandforfloat64. float16Halfprecisionfloat:signbit,5bitsexponent,10bitsmantissa float32Singleprecisionfloat:signbit,8bitsexponent,23bitsmantissa float64Doubleprecisionfloat:signbit,11bitsexponent,52bitsmantissa complex_Shorthandforcomplex128. complex64Complexnumber,representedbytwo32-bitfloats(realandimaginarycomponents) complex128Complexnumber,representedbytwo64-bitfloats(realandimaginarycomponents)
以上这篇基于DataFrame改变列类型的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。