我有一个csv文件,看起来像这样:
"3040",0.24948,-0.89496
"3041",0.25344,-0.89496
"3042",0.2574,-0.891
"3043",0.2574,-0.89496
"3044",0.26136,-0.89892
"3045",0.2574,-0.891
"3046",0.26532,-0.9108
"3047",0.27324,-0.9306
"3048",0.23424,-0.8910
此数据是“参考”数据,用于验证对其他数据进行的计算。读取数据可以得到以下信息:
In [2]: test = pd.read_csv('test.csv', header=0, names=['lx', 'ly'])
In [3]: test
Out[3]:
lx ly
3041 0.25344 -0.89496
3042 0.25740 -0.89100
3043 0.25740 -0.89496
3044 0.26136 -0.89892
3045 0.25740 -0.89100
3046 0.26532 -0.91080
3047 0.27324 -0.93060
3048 0.23424 -0.89100
看起来像您期望的那样。问题是,这些值看起来并不完全相同,无法与它们进行比较:
In [4]: test.loc[3042,'ly']
Out[4]: -0.8909999999999999
为什么要这么做 ?似乎是特定于csv中的值,至少到目前为止,该值仅在小数点后第3位:
In [5]: test.loc[3048,'ly']
Out[5]: -0.891
In [5]: test.loc[3048,'ly']
Out[5]: -0.891
In [6]: test.loc[3047,'ly']
Out[6]: -0.9306
In [7]: test.loc[3046,'ly']
Out[7]: -0.9108
我只想要csv的确切值,而不是解释。想法?
更新:
我在read_csv参数中设置了float_precision ='round_trip',这似乎可以解决它。 Document here.我不明白的是,为什么默认情况下会以读入的方式更改数据。这对于比较数据集似乎并不好。是否有更好的方法读取数据以针对其他数据框进行测试?
更新答案:
更改float_precision是我的工作,尽管我仍然不了解熊猫如何以这种方式歪曲数据。我在导入时发生转换,但0.891应该是0.891。
对于我的比较案例,我没有测试等效性,而是使用了其他一些东西:
# rather than
df1 == df2
# I tested as
(df1 / df2) - 1 > 1e-14
这对我来说很好用。
答案 0 :(得分:0)
似乎它链接到您正在加载的数据类型,在您的情况下为float64。使用float 32可以得到您所期望的。因此,您可以在loading时更改dtype
test = pd.read_csv('test.csv', header=0, names=['lx', 'ly'],
dtype={'ly': np.float32, 'ly': np.float32})
或之后
print(type(test.loc[3042,'ly'])) # <class 'numpy.float64'>
test[['lx', 'ly']] = test[['lx', 'ly']].astype('float32')
print(test.loc[3042,'ly']) # -0.891
答案 1 :(得分:0)
出于与其他df进行比较的目的,您可以使用pd.option_context,(请注意,我删除了header = 0,因为它没有在df中显示第一行):
import pandas as pd
test = pd.read_csv('./Desktop/dummy.csv', names=['lx', 'ly'])
test.dtypes
with pd.option_context('display.precision', 5):
print(test.loc[3042,'ly'])
输出:
-0.891
这不是最好的解决方法,但添加
float_precision='round_trip'
也不会总是解决您的问题:
import pandas as pd
test = pd.read_csv('./Desktop/dummy.csv', names=['lx', 'ly'], float_precision='round_trip')
test.dtypes
test.loc[3042,'ly']
输出:
-0.89100000000000001
使用display.precision,您将以您设置的精度在with语句下执行此代码下的所有代码块,因此,您可以保证在此条件下比较df将是您期望的值。