pandas.read_csv更改导入值

时间:2018-08-22 20:59:34

标签: python pandas

我有一个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

这对我来说很好用。

2 个答案:

答案 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将是您期望的值。