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

Python 为什么pandas.to_csv会为整数写浮点?,python,csv,types,pandas,type-conversion,Python,Csv,Types,Pandas,Type Conversion,我有下面的代码来解析一些csv数据。关键是最后几行,其余的只是显示上下文。基本上,我的数据最后有三列,ID变量LopNr和year“无论如何”都应该有整数,但我将整个数据帧转换为整数以防万一。为什么在生成的csv文件中,LopNr和year列的值为“.0”,而包含聚合数据的第三列实际转换为整数,并且输出时没有“.0”?我原以为在.astype(int)之后,所有列都将有整数,并且我们导出到csv时不会将它们转换回浮点 import iopro from pandas import * neur

我有下面的代码来解析一些csv数据。关键是最后几行,其余的只是显示上下文。基本上,我的数据最后有三列,ID变量LopNr和year“无论如何”都应该有整数,但我将整个数据帧转换为整数以防万一。为什么在生成的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')
导入iopro
从熊猫进口*
neuro=数据帧()
对于X范围内的年份(20052012):
对于X范围内的月份(1,13):
如果年份==2005且月份<7:
持续
文件名='Q:\\druges\\lmed.'+str(年)+''u mon'+str(月)+'.txt'
adapter=iopro.text_适配器(文件名,解析器='csv',字段名称=True,输出='dataframe',分隔符='\t')
每月=适配器[['LopNr'、'ATC'、'TKOST'][:]
每月['year']=年
neuro=neuro.append(monthly[(monthly.ATC.str.startswith('N'))和(~(monthly.TKOST.isnull()))
neuro=neuro.groupby(['LopNr','year']).sum()
神经型=神经型(int)
神经系统至csv('Q:\\药物\\年度神经系统成本.csv')

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


编辑:

从版本0.24.0开始,Pandas中已初步支持

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

df=pd.DataFrame([[1,2,无],[5,无,7]] >>打印(df) 0 1 2 0112.0NaN 1.5.7.0 但是,如果指定
dtype=“Int64”
,则不再发生这种情况:

df=pd.DataFrame([[1,2,无],[5,无,7]],dtype=“Int64”) >>打印(df) 0 1 2 0 1 2 1 5 7
如果不指定字段/列'LopNr'@dartdog,就不能在整个DF上使用astype,我不知道你的意思。肯定没有错误消息,并且有相应的帮助文件。或者你认为它只是在做最后一列?这在任何地方都没有记录,也没有其他astype用例。[嗯,我不知道,你为什么不给raise_on_error=True(raise_on_error:raise on invalid input)一次尝试,看看它是否告诉你什么?即使这应该是默认值……有没有办法通过转换为object/str来避免这种情况?