【发布时间】:2013-06-10 04:03:50
【问题描述】:
我有一个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()
【问题讨论】:
-
你应该
import pandas as pd:) -
@Andy 我为什么要这样做?命名空间是个好主意...直到您将它们全部缩写并且变得不可读。
-
@AndyHayden 打字时间更长,但绝对更容易阅读。对于遇到代码的新手来说,
pd表示警察局。或者如果他说法语更糟。 -
这只是一个约定 - 使用它,或者不使用它 - 取决于您的受众可能是谁的期望 - 对于许多 pandas 用户来说,约定是使用 pd,就像在英国,惯例是靠左行驶。除非您必须共用同一段路,否则这不是问题。
-
我认为这个类比是不够的,因为靠左行驶与靠右行驶是不相容的。但是,对于了解缩写标准的老手来说,使用完整的包名可以正常工作,而相反则不正确(新手对
pd感到困惑)。
标签: python csv dataframe pandas