Python pandas:用整数将数据帧输出到csv

2024-03-29 14:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas.DataFrame要导出到CSV文件。然而,pandas似乎将一些值编写为float,而不是int类型。我找不到改变这种行为的方法。

建立数据框架:

df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'], dtype=int)
x = pandas.Series([10,10,10], index=['a','b','d'], dtype=int)
y = pandas.Series([1,5,2,3], index=['a','b','c','d'], dtype=int)
z = pandas.Series([1,2,3,4], index=['a','b','c','d'], dtype=int)
df.loc['x']=x; df.loc['y']=y; df.loc['z']=z

查看:

>>> df
    a   b    c   d
x  10  10  NaN  10
y   1   5    2   3
z   1   2    3   4

导出它:

>>> df.to_csv('test.csv', sep='\t', na_rep='0', dtype=int)
>>> for l in open('test.csv'): print l.strip('\n')
        a       b       c       d
x       10.0    10.0    0       10.0
y       1       5       2       3
z       1       2       3       4

为什么十位数有一个零点?

当然,我可以将此函数插入我的管道以重新转换整个CSV文件,但似乎没有必要:

def lines_as_integer(path):
    handle = open(path)
    yield handle.next()
    for line in handle:
        line = line.split()
        label = line[0]
        values = map(float, line[1:])
        values = map(int, values)
        yield label + '\t' + '\t'.join(map(str,values)) + '\n'
handle = open(path_table_int, 'w')
handle.writelines(lines_as_integer(path_table_float))
handle.close()

Tags: csvpathmappandasdfindexlineopen
3条回答

我在寻找的答案与“杰夫”在答案中的提议略有不同。功劳归于他。这是我最终解决问题的参考:

    import pandas
    df = pandas.DataFrame(data, columns=['a','b','c','d'], index=['x','y','z'])
    df = df.fillna(0)
    df = df.astype(int)
    df.to_csv('test.csv', sep='\t')

问题是,由于您是按行分配数据的,但数据类型是按列分组的,因此数据类型会转换为object数据类型,这不是一件好事,您将失去所有的效率。因此,一种方法是根据需要转换将强制为float/int dtype的类型。

正如我们在另一个问题中所回答的,如果您一次构建框架(或逐列构建),则不需要执行此步骤

In [23]: def convert(x):
   ....:     try:
   ....:         return x.astype(int)
   ....:     except:
   ....:         return x
   ....:     

In [24]: df.apply(convert)
Out[24]: 
    a   b   c   d
x  10  10 NaN  10
y   1   5   2   3
z   1   2   3   4

In [25]: df.apply(convert).dtypes
Out[25]: 
a      int64
b      int64
c    float64
d      int64
dtype: object

In [26]: df.apply(convert).to_csv('test.csv')

In [27]: !cat test.csv
,a,b,c,d
x,10,10,,10
y,1,5,2.0,3
z,1,2,3.0,4

这是一个"gotcha" in pandas (Support for integer NA),其中带nan的整数列被转换为浮点数。

This trade-off is made largely for memory and performance reasons, and also so that the resulting Series continues to be “numeric”. One possibility is to use dtype=object arrays instead.

相关问题 更多 >