Pandas Dataframe.to_csv中的decimal=','无法工作

9
在Python中,我正在将我的Pandas数据框写入CSV文件,并希望将小数分隔符更改为逗号(,)。像这样:
results.to_csv('D:/Data/Kaeashi/BigData/ProcessMining/Voorbeelden/Voorbeeld/CaseEventsCel.csv', sep=';', decimal=',')

但是csv文件中的小数点分隔符仍然是.,为什么呢?我做错了什么吗?

1
您可以在控制台中键入pandas.__version__来检查pandas的版本。文档说明您所需的操作是“新版本0.16.0中的新功能”。也许您的版本还不支持这个功能? - Ohumeronen
5个回答

9
如果decimal参数无法正常工作,可能是因为该列的类型是object。(当您执行df[column_name]时,请检查最后一行中的dtype值。)
如果某些行的值无法解析为数字,则可能会发生这种情况。
您可以强制更改列的类型:在Pandas中更改列的数据类型。但这可能会使您失去该列中的非数字数据。

1

这个功能直到0.16.0才被添加。

在to_csv中添加了十进制选项,以提供非“.”小数分隔符的格式(GH781

将pandas升级到更高版本,它就可以工作了。下面的代码使用10分钟教程和pandas版本0.18.1

>>> import pandas as pd
>>> import numpy as np
>>> dates = pd.date_range('20130101', periods=6)
>>> df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
>>> df
                   A         B         C         D
2013-01-01 -0.157833  1.719554  0.564592 -0.228870
2013-01-02 -0.316600  1.545763 -0.206499  0.793412
2013-01-03  1.905803  1.172803  0.744010  1.563306
2013-01-04 -0.142676 -0.362548 -0.554799 -0.086404
2013-01-05  1.708246 -0.505940 -1.135422  0.810446
2013-01-06 -0.150899  0.794215 -0.628903  0.598574
>>> df.to_csv("test.csv", sep=';', decimal=',')

这将创建一个名为“test.csv”的文件,其内容如下:
;A;B;C;D
2013-01-01;-0,157833276159;1,71955439009;0,564592278787;-0,228870244247
2013-01-02;-0,316599953358;1,54576303958;-0,206499307398;0,793411528039
2013-01-03;1,90580284184;1,17280324924;0,744010110291;1,56330623177
2013-01-04;-0,142676406494;-0,36254842687;-0,554799190671;-0,0864039782679
2013-01-05;1,70824597265;-0,50594004498;-1,13542154086;0,810446051841
2013-01-06;-0,150899136973;0,794214730009;-0,628902891897;0,598573645748

1
当数据是一个对象而不是普通的浮点类型时,例如Python中的decimal.Decimal(10.12)。首先,改变类型,然后写入CSV文件:
import pandas as pd
from decimal import Decimal

data_frame = pd.DataFrame(data={'col1': [1.1, 2.2], 'col2': [Decimal(3.3), Decimal(4.4)]})
data_frame.to_csv('report_decimal_dot.csv', sep=';', decimal=',', float_format='%.2f')

data_frame = data_frame.applymap(lambda x: float(x) if isinstance(x, Decimal) else x)
data_frame.to_csv('report_decimal_comma.csv', sep=';', decimal=',', float_format='%.2f')


float_format='%.2f' 是真正为我所用的。 - ASB

0

不知道为什么我也无法让它工作。我最终总是使用以下脚本来纠正它。虽然有点不规范,但对我来说有效:

for col in df.columns:
    try:
        df[col] = df[col].apply(lambda x: float(x.replace('.','').replace(',','.')))
   except:
        pass

编辑:我误读了问题,你可以通过将所有浮点数更改为字符串来使用相同的策略 :)。不过,你最好弄清楚为什么它不起作用。如果你成功了,请发布一篇文章。


0

这个例子应该可以工作(因为它对我来说有效):

import pandas as pd
import numpy as np

s = pd.Series(np.random.randn(10))
with open('Data/out.csv', 'w') as f:
    s.to_csv(f, index=True, header=True, decimal=',', sep=';', float_format='%.3f')

out.csv:

;0
0;0,091
1;-0,009
2;-1,427
3;0,022
4;-1,270
5;-1,134
6;-0,965
7;-1,298
8;-0,854
9;0,150
我不确定为什么你的代码不起作用,但是无论如何,请尝试根据上面的示例来满足您的需求。

即使这个没有成功。 - Jos van der Heijden
你尝试升级已安装的pandas了吗? - Gal Dreiman
df.to_csv(csvFile, sep="\t", index=False) --> 这不会在数据框df的列之间提供制表符空格。如果我删除sep,则默认使用逗号(,)并将文本放在双引号""下。但是我想要在csv文件中使用制表符分隔符来拥有两个列。谢谢! - Innovator-programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接