将熊猫数据框写入csv时获取奇怪的输出

问题描述:

我已将我的数据读入熊猫数据框。我希望根据两个变量“区域”和“类型”将数据拆分为单独的文件。将熊猫数据框写入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我已更新我的文章以回答您的问题。 –

啊,这比看起来简单。您的格式"%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

好的,这是有道理的。那么我怎么能输出我的浮点变量在一个空格分隔的文件中有合理数量的有效数字,同时避免了这个填充问题? –

你浮点格式垫带空格的值,但你也试图用一个空间作为现场分隔器。所以这些字段必须被引用,否则你不能分辨哪些空格是(填充的)浮点值的一部分,哪些是字段分隔符。

要修复它,要么不填充您的值,要么不要使用空格作为分隔符。不填充值可能更明智。空间填充是一个视觉呈现调整,基本上将您的浮动变成字符串。如果您只关心输出浮点值,则不关心它们是否被很好地填充到特定的字段宽度。

+0

这很有道理。以逗号分隔的文件将是最好的,但我需要创建一个空格分隔的输出文件,稍后其他FORTRAN应用程序将使用它们,这些输入文件在输入时不灵活。我怎样才能避免填充我的浮点数而不输出大量的小数位? –

+0

@FluxCapacitor:如果您只是使用像''%这样的格式。3',这应该将其限制在3位小数,而不用填充它。 – BrenBarn