首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python pandas:将数据帧输出到带有整数的csv

Python pandas:将数据帧输出到带有整数的csv
EN

Stack Overflow用户
提问于 2013-06-14 00:47:36
回答 6查看 51.4K关注 0票数 39

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

构建数据框:

代码语言:javascript
复制
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

查看它:

代码语言:javascript
复制
>>> df
    a   b    c   d
x  10  10  NaN  10
y   1   5    2   3
z   1   2    3   4

导出它:

代码语言:javascript
复制
>>> 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文件,但这似乎没有必要:

代码语言:javascript
复制
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()
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-03 17:42:56

我正在寻找的答案是@Jeff在他的答案中提出的一个细微的变化。功劳归功于他。这就是我最终解决的问题,供参考:

代码语言:javascript
复制
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')
票数 18
EN

Stack Overflow用户

发布于 2013-06-14 01:05:52

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

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

代码语言:javascript
复制
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
票数 8
EN

Stack Overflow用户

发布于 2018-08-20 02:57:34

如果您想在已导出的csv中保留NaN信息,请执行以下操作。附注:在这种情况下,我集中在列'C‘上。

代码语言:javascript
复制
df[c] = df[c].fillna('')       #filling Nan with empty string
df[c] = df[c].astype(str)      #convert the column to string 
>>> df
    a   b    c     d
x  10  10         10
y   1   5    2.0   3
z   1   2    3.0   4

df[c] = df[c].str.split('.')   #split the float value into list based on '.'
>>> df
        a   b    c          d
    x  10  10   ['']       10
    y   1   5   ['2','0']   3
    z   1   2   ['3','0']   4

df[c] = df[c].str[0]            #select 1st element from the list
>>> df
    a   b    c   d
x  10  10       10
y   1   5    2   3
z   1   2    3   4

现在,如果您将数据帧导出到csv,则列'c‘将不具有浮点值,并且NaN信息将被保留。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17092671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档