Python pandas.DataFrame.round不';似乎无法处理我的数据帧-舍入问题会导致csv文件中存储额外的数据
在使用熊猫数据帧时,我偶然发现了一个小问题: 我有一个大的csv文件(大约2Gb的数据),包含资产的价格,并使用Pandas的Python pandas.DataFrame.round不';似乎无法处理我的数据帧-舍入问题会导致csv文件中存储额外的数据,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,在使用熊猫数据帧时,我偶然发现了一个小问题: 我有一个大的csv文件(大约2Gb的数据),包含资产的价格,并使用Pandas的DataFrame.to_csv()函数创建,当我仔细检查代码时,我的第一行代码如下所示: DateTime,open,high,low,close 2016-01-04 00:36:18,1.08505,1.08505,1.08504,1.08504 2016-01-04 00:36:19,1.08505,1.08505,1.08504,1.08504 2016-01-
DataFrame.to_csv()
函数创建,当我仔细检查代码时,我的第一行代码如下所示:
DateTime,open,high,low,close
2016-01-04 00:36:18,1.08505,1.08505,1.08504,1.08504
2016-01-04 00:36:19,1.08505,1.08505,1.08504,1.08504
2016-01-04 00:36:20,1.08503,1.08503,1.08495,1.08495
2016-01-04 00:36:21,1.0849600000000001,1.0849600000000001,1.0849600000000001,1.0849600000000001
2016-01-04 00:36:22,1.0849600000000001,1.0849600000000001,1.08492,1.08492
数据是使用df.resample('1s').ohlc()
创建的,我认为有时会有一些舍入问题,所以我尝试使用df.round(5)
对数据帧进行舍入,以保持最后5位小数,但它根本不会改变任何东西
SEC = pd.read_csv("D:\Finance python\Data\EUR_USD\Sec\S1_2015.csv",index_col='DateTime',parse_dates=True,error_bad_lines=False,infer_datetime_format=True)
SEC = SEC.round(5)
数据帧保持不变,我真想知道为什么
当我尝试使用包含我上面给出的5行的csv文件时:
In[13]: SEC["open"][3]
Out[13]: 1.0849599999999999
在df上进行计算时,这不是问题(即使小数越少,速度可能越快),但似乎有很多0或9被免费存储在我的csv文件中,并且占用了额外的空间
而且,即使在csv文件中看起来很好的值,在使用pandas调用时实际上也不是很全面
有谁知道为什么数据框没有被正确舍入,或者有一个解决方案,当我用pandas保存它们时,有更短的csv文件
提前谢谢
编辑:我尝试使用十进制方法,但仍然不起作用。
我认为这是因为pandas无法在数据帧中存储十进制类型的数字,因此无法将其转换为浮点。我尝试运行您的代码:
df = pd.read_clipboard(sep=',',engine='python')
df
DateTime open high low close
0 2016-01-04 00:36:18 1.08505 1.08505 1.08504 1.08504
1 2016-01-04 00:36:19 1.08505 1.08505 1.08504 1.08504
2 2016-01-04 00:36:20 1.08503 1.08503 1.08495 1.08495
然后使用df.round(3)
它对我有效,但当我
df.astype(str).round(3)
时,它就不起作用了。因此我建议您检查数据的类型 这与浮点运算的精度有关;并非所有数字都能准确表示。如果要将熊猫显示的数字设置为小数点后5位,可以执行以下操作
pd.set_options('display.float_format','{:.5f}')
但内部表示将保持不变(仔细阅读您的帖子后,它不会用csv解决您的问题)
如果要更改内部表示形式,则需要使用Decimal
数据类型:
from decimal import Decimal
df.round(5).astype(Decimal)
仅供参考,您可以这样重现您的问题:
import numpy as np
np.float64(1.08496)
我在另一篇帖子上找到了问题所在:
我需要使用参数float_format='%.5f
来获得我想要的csv文件,这个问题与浮点数的工作方式有关。无法重现您的问题:-)@Wen您用我提供的行尝试了吗?我只尝试了这5行,我遇到了同样的问题,它不会对值进行取整(我在问题中添加了它),实际上不起作用,数据保持不变。当我检查df中数据的类型时,它是一个浮点数,而不是十进制数,我想pandas不允许dataframe中的数据具有十进制类型。您必须重新分配dataframe,例如df=df.round(5).astype(decimal)
。但是,如果您只对写入csv的数据感兴趣,那么您肯定更喜欢使用中的float\u format
参数来读取csv
(我完全忘记了这一点)。我从df=df.round(0)。astype(Decimal)
中得到TypeError:dtype''不理解
import numpy as np
np.float64(1.08496)