最近使用pandas處理一批數據,數據中包含幾個columns,它們的數據精度,例如
3.25165,1451684684168.0,0.23
處理完之后保存csv時發現,1451684684168.0被保存為1.45168e+12,我需要完全保存數據信息
Google一番發現pandas自帶了如下函數:
DataFrame.to_csv('out.csv', float_format = '%.3f')
由於我的文件中包含不同精度數據,不能一概而論,所以初步想法是想把1451684684168.0轉換為str處理,
有以下幾種辦法:
1.df['id'].apply(str)或者df['id'].astype(basestring)
這個方法可以將某個column變為str,缺點是不能控制精度,轉出來還是1.45168e+12
2.pandas.DataFrame.to_string或者pandas.Series.to_string
這個兩種方法可以將整個DataFrame或者Series轉成str,參數很多,而且可以控制精度。
需要注意的是參數formatters和float_format,它們兩的參數是以函數的形式給出的
######################################################
myformatter = lambda x: '%4.1f' % x
formatters = {'A': myformatter}
float_format = myformatter
######################################################
由於我使用的是pd(0.17.1)版本,與官方的0.19.2的不同,
pandas.Series.to_string參數中缺少index
所以我將Series轉換為DataFrame處理,下面給出代碼:
#####################################################
Tpart1 = dfN.iloc[:,0:12]
Tpart2 = dfN.iloc[:,12]
Tpart3 = dfN.iloc[:,13:16]
myformat = lambda x: '%.0f'%x # #保留整數
str1 = pd.DataFrame(Tpart2, columns=['time'])
str2 = str1.to_string(float_format = myformat, index = False, header = False) # #去除column name以及index name
str3 = str2.split('\n')
Tpart2 = pd.DataFrame(str3, columns=['time']) ##重新變為DataFrame
npart1 = pd.concat([Tpart1, Tpart2, Tpart3], axis = 1) # #合並
#######################################################
pandas的向量處理速度還是很快的,程序中盡量不使用for語句來逐一處理。