python - 为什么 pandas.to_csv 为整数写 float ?

标签 python csv types pandas type-conversion

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

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”和“year”列具有空值。目前,pandas 不支持具有空值的整数列,而是将整列上转换为 float 。

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 .

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

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

关于python - 为什么 pandas.to_csv 为整数写 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23431613/

相关文章:

python - 如何在django中调用 View 文件中的模型函数

php - 将 CSV 插入 MySQL

Haskell 使用 foldl 之类的递归

haskell - 如何测试这种数据类型的半群定律?

java - 我需要在 AsyncTask 执行中传递一个变量,但不知道如何执行

python - 在Python中将行添加到按ID排序的CSV中,而不将整个文件读入内存

python - 遍历字典并添加值

c# - 使用 csvhelper 进行映射/写入协助

R 列和 type.convert(data[[i]] 中的错误,特别是在 Mac 上