将Pandas数据帧写入csv时获取奇怪的输出

时间:2015-11-03 17:51:14

标签: python csv pandas

我已将数据读入Pandas数据帧。我希望根据两个变量“Zone”和“Type”将数据拆分成单独的文件。

所以我希望有类似的东西:

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

2 个答案:

答案 0 :(得分:2)

您的float格式用空格填充值,但您也尝试使用空格作为字段分隔符。因此必须引用字段,否则您无法分辨哪些空格是(填充的)浮点值的一部分,哪些是字段分隔符。

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

答案 1 :(得分: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模块可以&#39; t。)