2015-11-03 57 views
0

我已將我的數據讀入熊貓數據框。我希望根據兩個變量「區域」和「類型」將數據拆分爲單獨的文件。將熊貓數據框寫入csv時獲取奇怪的輸出

所以,我想有這樣的:

contents[(contents['Zone']==zone) & (contents['Type']==type)].to_csv(outfl, sep=' ', header=False, index = False, float_format='%9.3f') 

奇怪的是,我的輸出是這樣的:

200 225 255 504671.321 6342290.967 " -323.271" 1 " 0.040" " 0.319" " 0.249" " 0.141" " 2.000" 
202 224 254 504721.351 6342265.992 " -323.725" 1 " 0.032" " 0.254" " 0.258" " 0.127" " 2.000" 
200 225 254 504671.321 6342290.967 " -323.350" 1 " 0.038" " 0.376" " 0.243" " 0.137" " 2.000" 
201 225 254 504696.336 6342290.967 " -323.593" 1 " 0.035" " 0.359" " 0.249" " 0.128" " 2.000" 

爲什麼這些引號字符出現?我不想讓他們(obv),因爲我試圖創建一個空格分隔的輸出文件。好像我正在做的float_format錯誤...但不知道是什麼?

print contents.info() 

產量:

編輯在別人的請求添加信息

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 233976 entries, 0 to 233975 
Data columns (total 12 columns): 
I     233976 non-null int64 
J     233976 non-null int64 
K     233976 non-null int64 
X     233976 non-null float64 
Y     233976 non-null float64 
Z     233976 non-null float64 
Type    233976 non-null int64 
VMI_LVMI   233976 non-null float64 
SWT     233976 non-null float64 
PHIT    233976 non-null float64 
VCLA    233976 non-null float64 
Zone    233976 non-null float64 
dtypes: float64(8), int64(4) 
memory usage: 23.2 MB 
None 
+0

@DSM我已更新我的文章以回答您的問題。 –

回答

2

啊,這比看起來簡單。您的格式"%9.3f"意味着你將不得不在左邊多餘的空格,如果你的號碼是足夠小:

>>> format(123.456, "9.3f") 
' 123.456' 
>>> format(123789.456, "9.3f") 
'123789.456' 

但你的分隔符是空格,這意味着你的輸出是模糊的(你有空間既作爲分隔符也作爲數據的一部分)。因此,它被引用,這樣就可以成功地反其道而行:

>>> df.to_csv("out.csv", sep=";", float_format="%9.3f") 
>>> !cat out.csv 
;A;B 
0;1; 0.000 
1;2; 0.333 
2;3; 0.667 
>>> df.to_csv("out.csv", sep=" ", float_format="%9.3f") 
>>> !cat out.csv 
A B 
0 1 " 0.000" 
1 2 " 0.333" 
2 3 " 0.667" 

我不是擺在首位空格分隔的文件的大風扇,但如果你真的想要一個,你可以簡單地改變你的格式不要在左邊包括總大小。修改幀後更有趣:

>>> df.to_csv("out.csv", sep=" ", float_format="%.3f", index=False) 
>>> !cat out.csv 
A B 
1 0.000 
2 0.333 
3 123456.789 

另外,如果你想保持對齊,但沒有報價,你可以使用df.to_string()和寫出來:

>>> s = df.to_string(float_format=lambda x: "%9.3f" % x) 
>>> print(s) 
    A   B 
0 1  0.000 
1 2  0.333 
2 3 123456.789 

與否這是一個好主意取決於你是否期望閱讀這篇文章能夠處理多字符分隔符。 (例如,Python的csv模塊不能。)

+0

好的,這是有道理的。那麼我怎麼能輸出我的浮點變量在一個空格分隔的文件中有合理數量的有效數字,同時避免了這個填充問題? –

2

你浮點格式墊帶空格的值,但你也試圖用一個空間作爲現場分隔器。所以這些字段必須被引用,否則你不能分辨哪些空格是(填充的)浮點值的一部分,哪些是字段分隔符。

要修復它,要麼不填充您的值,要麼不要使用空格作爲分隔符。不填充值可能更明智。空間填充是一個視覺呈現調整,基本上將您的浮動變成字符串。如果您只關心輸出浮點值,則不關心它們是否被很好地填充到特定的字段寬度。

+0

這很有道理。以逗號分隔的文件將是最好的,但我需要創建一個空格分隔的輸出文件,稍後其他FORTRAN應用程序將使用它們,這些輸入文件在輸入時不靈活。我怎樣才能避免填充我的浮點數而不輸出大量的小數位? –

+0

@FluxCapacitor:如果您只是使用像''%這樣的格式。3',這應該將其限制在3位小數,而不用填充它。 – BrenBarn