为什么pandas.to_csv会将整数写成浮点数?

5
我有以下代码来解析一些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')

不要以为你可以在没有指定字段/列“LopNr”的情况下在整个DF上使用astype。 - dartdog
@dartdog 我不确定你的意思。肯定没有错误信息,也有相应的帮助文件。或者你认为它只是在做最后一列?这在任何地方都没有记录,或者其他 astype 的用例。[http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.astype.html] - László
MMM不知道,为什么不尝试一下raise_on_error = True(raise_on_error:在无效输入时引发异常),看它是否会告诉您一些信息?尽管那应该是默认的... - dartdog
1个回答

4
这可能是因为你的“LopNr”和“year”列有空值。目前,pandas不支持具有空值的整数列,而是将整个列转换为浮点数。

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


编辑:

从版本0.24.0开始,Pandas初步支持可空整数数据类型

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

>> 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

有没有办法通过转换为对象/字符串来避免这种情况? - xjcl
1
如果我的一些列有浮点数,会怎么样? - Samir Kape

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