【问题标题】:why does pandas.to_csv write floats for integers?为什么 pandas.to_csv 为整数写浮点数?
【发布时间】:2014-06-19 08:13:54
【问题描述】:

我有下面的代码来解析一些 csv 数据。关键是最后几行,其余的只是为了显示上下文。基本上,最后我的数据中有三列,ID 变量 LopNr 和 year 应该有整数“无论如何”,但我将整个 DataFrame 转换为整数以防万一。为什么我在生成的 csv 文件中得到 LopNr 和 year 列的“.0”,而带有聚合数据的第三列实际上被转换为整数并且输出时没有“.0”?我原以为.astype(int) 之后所有的列都会有整数,并且我们导出到 csv 而不将它们转换回浮点数。

import iopro
from pandas import *

neuro   = DataFrame()
for year in xrange(2005,2012):
    for month in xrange(1,13):
        if year == 2005 and month < 7:
            continue
        filename = 'Q:\\drugs\\lmed_' + str(year) + '_mon'+ str(month) +'.txt'
        adapter = iopro.text_adapter(filename,parser='csv',field_names=True,output='dataframe',delimiter='\t')
        monthly = adapter[['LopNr','ATC','TKOST']][:]
        monthly['year']=year
        neuro = neuro.append(monthly[(monthly.ATC.str.startswith('N')) & (~(monthly.TKOST.isnull()))])

neuro = neuro.groupby(['LopNr','year']).sum()
neuro = neuro.astype(int)
neuro.to_csv('Q:\\drugs\\annual_neuro_costs.csv')

【问题讨论】:

  • 不要认为你可以在整个 DF 上使用 astype 而不指定字段/列 'LopNr'
  • @dartdog 我不确定你的意思。肯定没有错误信息,并且有相应的帮助文件。或者你隐含地认为它只是在做最后一列?这在任何地方都没有记录,也没有记录在 astype 的其他用例中。 [pandas.pydata.org/pandas-docs/version/0.13.1/generated/…
  • MMM 不知道,你为什么不试试 raise_on_error=True (raise_on_error : raise on invalid input) 看看它是否告诉你什么?即使这应该是默认设置....

标签: python csv types pandas type-conversion


【解决方案1】:

这可能是因为您的 'LopNr' 和 'year' 列有空值。目前,pandas 不支持具有空值的整数列,而是将整列上转换为浮点数。

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#nan-integer-na-values-and-na-type-promotions


编辑:

从 0.24.0 版开始,Pandas 初步支持nullable integer data type

默认情况下,如果缺少值,整数仍会转换为浮点数:

>> df = pd.DataFrame([[1, 2, None], [5, None, 7]])
>> print(df)
   0    1    2
0  1  2.0  NaN
1  5  NaN  7.0

但是,如果我们指定 dtype="Int64",则不再发生这种情况:

>> df = pd.DataFrame([[1, 2, None], [5, None, 7]], dtype="Int64")
>> print(df)
   0     1     2
0  1     2  <NA>
1  5  <NA>     7

【讨论】:

  • 有什么方法可以通过转换为 object/str 来避免这种情况?
  • 如果我的某些列有浮点数怎么办?
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 2021-05-14
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
相关资源
最近更新 更多