Pandas格式 - 如何将DataFrame float64列(带NaNs)保存为int?

时间:2017-01-23 11:21:11

标签: python pandas floating-point scientific-notation number-formatting

我的DataFrame有大约20列,混合列类型;其中一个是15到18位的身份证号码。某些行没有ID号(列中有NaN)。在阅读.csv时,身份证号码是用科学记数法写的,但却失去了身份证号码的好处......

我正在尝试找到一种方法将DataFrame保存为csv(使用.to_csv),同时将此ID号保存为完整的int形式。

我发现最接近的是Format / Suppress Scientific Notation from Python Pandas Aggregation Results,但它会更改所有列,我只想更改一列。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

您可以在致电float_format

时使用to_csv()
df.to_csv(filepath, index=False, sep='\t', float_format='%.6f')

在此完整答案:convert scientific notation to decimal pandas python

在您使用ID的情况下,您可以尝试将6更改为0

答案 1 :(得分:0)

正如MaxU在评论中所说,最好的方法是使用NaN的占位符。

我在列上使用.fillna(-9999)删除了NaN,然后​​很容易将ID表示为int(使用.astype(int)dtype)。

问题解决了。

答案 2 :(得分:0)

从熊猫0.24(2019年1月)开始,您可以将数据表示为arrays.IntegerArray,对应于nullable integers,从而在坚持惯用熊猫的同时实现所需的功能。

例如,假设以下是使用浮点数的结果:

In [99]: df.Id
Out[99]:
0    1.000000e+18
1    2.000000e+18
2    3.000000e+18
3             NaN
4    4.000000e+18
Name: Id, dtype: float64

In [100]: df.Id.to_csv('output.csv')

In [101]: !cat output.csv
0,1e+18
1,2e+18
2,3e+18
3,
4,4e+18

然后,使用dtype 'Int64',您将获得以下内容:

In [102]: df.Id.astype('Int64')
Out[102]:
0    1000000000000000000
1    2000000000000000000
2    3000000000000000000
3                    NaN
4    4000000000000000000
Name: Id, dtype: Int64

In [103]: df.Id.astype('Int64').to_csv('output.csv')

In [104]: !cat output.csv
0,1000000000000000000
1,2000000000000000000
2,3000000000000000000
3,
4,4000000000000000000