【问题标题】:Pandas Dataframe.to_csv decimal=',' doesn't workPandas Dataframe.to_csv decimal=',' 不起作用
【发布时间】:2021-01-29 19:49:11
【问题描述】:

在 Python 中,我将我的 Pandas Dataframe 写入 csv 文件,并希望将小数分隔符更改为逗号 (,)。像这样:

results.to_csv('D:/Data/Kaeashi/BigData/ProcessMining/Voorbeelden/Voorbeeld/CaseEventsCel.csv', sep=';', decimal=',')

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

【问题讨论】:

  • 您可以通过在控制台中输入 pandas.__version__ 来检查 pandas 的版本。文档说明您想要的操作是“0.16.0 版中的新功能”。也许你的版本还不支持这个?

标签: python csv pandas


【解决方案1】:

如果decimal参数不起作用,可能是因为列的类型是object。 (当你做df[column_name]时检查最后一行中的dtype值)

如果某些行包含无法解析为数字的值,就会发生这种情况。

您可以强制列更改类型: Change data type of columns in Pandas。 但这会使您丢失该列中的非数字数据。

【讨论】:

    【解决方案2】:

    直到0.16.0 才添加此功能

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

    将 pandas 升级到更新的版本,它就可以工作了。下面的代码使用10 minute tutorial和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
    

    【讨论】:

      【解决方案3】:

      不知何故,我也无法正常工作。我总是最终使用以下脚本来纠正它。它很脏,但对我有用:

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

      编辑:误读了问题,您可能会通过将所有浮点数更改为字符串来使用相同的策略:)。再说一次,您可能应该弄清楚它为什么不起作用。如果你让它工作,就发布它。

      【讨论】:

        【解决方案4】:

        这个例子假设可以工作(因为它对我有用):

        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

        我不明白为什么您的代码不起作用,但无论如何,请尝试根据您的需要使用上面的示例。

        【讨论】:

        • 即使这样也没有成功
        • 您是否尝试升级已安装的 pandas?
        • df.to_csv(csvFile, sep="\t", index=False) --> 这不提供数据框 df 列之间的制表符空间。如果我删除 sep,那么默认情况下它需要逗号 (,) 并且文本位于双引号“”下。但我想通过使用制表符分隔符在 csv 文件中拥有这两个 coulmns。谢谢!
        【解决方案5】:

        如果数据是一个对象,而不是一个普通的浮点类型,例如 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')
        
        

        【讨论】:

          猜你喜欢
          • 2023-03-07
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2021-07-16
          • 1970-01-01
          • 2015-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多