我想寻求补救措施的指导,以解决我在pandas.read_csv例程中发现的问题。当我使用pd.to_csv将长整数存储到文件中时,它会很好地存储数据-但是当我使用pd.read_csv读回它时,它会使最后3位数字混乱。当我尝试使用to_csv(无任何编辑)将其再次保存回时,结果CSV文件中的数字与原始CSV文件不同。我在下面说明了这个问题(请注意,4321113141090630389变成4321113141090630400以及4321583677327450765变成4321583677327450880):
由pd.to_csv创建的原始CSV文件:
grep -e 321583677327450 -e 321113141090630 orig.piece
orig.piece:1,1;0;0;0;1;1;3844;3844;3844;1;1;1;1;1;1;0;0;1;1;0;0,,,4321583677327450765
orig.piece:5,1;0;0;0;1;1;843;843;843;1;1;1;1;1;1;0;0;1;1;0;0,64.0,;,4321113141090630389
import pandas as pd
import numpy as np
orig = pd.read_csv('orig.piece')
orig.dtypes
Unnamed: 0 int64
aa object
act float64
...
...
s_act float64
dtype: object
>orig['s_act'].head(6)
0 NaN
1 4.321584e+18
2 4.321974e+18
3 4.321494e+18
4 4.321283e+18
5 4.321113e+18
Name: s_act, dtype: float64
>orig['s_act'].fillna(0).astype(int).head(6)
0 0
1 4321583677327450880
2 4321973950881710336
3 4321493786516159488
4 4321282586859217408
5 4321113141090630400
>orig.to_csv('convert.piece')
grep -e 321583677327450 -e 321113141090630 orig.piece convert.piece
orig.piece:1,1;0;0;0;1;1;3844;3844;3844;1;1;1;1;1;1;0;0;1;1;0;0,,,4321583677327450765
orig.piece:5,1;0;0;0;1;1;843;843;843;1;1;1;1;1;1;0;0;1;1;0;0,64.0,;,4321113141090630389
convert.piece:1,1;0;0;0;1;1;3844;3844;3844;1;1;1;1;1;1;0;0;1;1;0;0,,,4.321583677327451e+18
convert.piece:5,1;0;0;0;1;1;843;843;843;1;1;1;1;1;1;0;0;1;1;0;0,64.0,;,4.3211131410906304e+18
您能帮我理解一下为什么read_csv会将最后三位数字弄混吗?它甚至不是一个四舍五入的问题,数字是完全不同的(例如4321583677327450765变成上面的4321583677327450880)是因为出现了科学记数法-我们如何禁用它并让大熊猫将此数据当作对象/字符串或计划来对待整数/浮点数?
这是浮点错误。因为该s_act
列具有缺失值(熊猫没有整数缺失值),所以它s_act
以dtype = float进行读入(dtypes在pandas中在列级别定义)。因此,您基本上会看到以下内容:
>>> x = 4321113141090630389
>>> float(x)
4.32111314109063e+18
>>> int(float(x))
4321113141090630144
就解决方案而言,您可以s_act
在读入字符串时将其dtype更改为字符串(结果dtype将被拒绝)。例如:
data = """
id,val,x
1,4321113141090630389,4
2,,5
3,200,4
"""
df = pd.read_csv(StringIO(data),header=True,dtype={'val':str})
print df
id val x
0 1 4321113141090630389 4
1 2 NaN 5
2 3 200 4
print df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 3 columns):
id 3 non-null int64
val 2 non-null object
x 3 non-null int64
df['val'] = df['val'].fillna(0).astype(int)
print df
id val x
0 1 4321113141090630389 4
1 2 0 5
2 3 200 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句