熊猫-导入CSV问题-最后添加和删除0

时间:2018-06-20 23:24:35

标签: python pandas csv floating-point series

我想导入一个CSV数据集。 我的问题是,当我导入基础时,熊猫尝试将其转换为某种东西。

让我用数字解释。 这或多或少是我的csv文件的格式。

> Data, Id, Text

>2018-06-11, 17980873.3391, bla bla bla 

>2018-06-11, 17980874.4560, bla bla bla

>2018-06-11, 17980876.8560, bla bla bla

问题是当我使用pd.read_csv导入它时。 Id栏应完全与csv文件中的方式相同(我想将其用作进行搜索的过滤器)。但是熊猫正在返回类似的内容:

当我导入时结构没有变化(熊猫自动将列转换为float)

> Data, Id, Text

>2018-06-11, 17980873.33910, bla bla bla 

>2018-06-11, 17980874.45600, bla bla bla

>2018-06-11, 17980876.85600, bla bla bla

当我导入数据集并将id列转换为type(str)时:

> Data, Id, Text

>2018-06-11, 17980873.3391, bla bla bla 

>2018-06-11, 17980874.456, bla bla bla

>2018-06-11, 17980876.856, bla bla bla

正在删除并添加0。 我真的不知道如何让大熊猫输入真实数字

>17980876.8560

希望我已经使自己了解了。我仍在学习如何在这里提问。

谢谢!

2 个答案:

答案 0 :(得分:2)

dtype的{​​{1}}设置为Id,不进行翻译。

给出:

str

使用:

Data,Id,Text
2018-06-11,17980873.3391,bla bla bla
2018-06-11,17980874.4560,bla bla bla
2018-06-11,17980876.8560,bla bla bla

获得:

import pandas as pd
data = pd.read_csv('data.csv',dtype={'Id':str})
print(data)

这确实假定您的ID字段是8位点4位字符串,而不是浮点值。

答案 1 :(得分:1)

您首先应该了解,Pandas并未将您的数字读为十进制17980873.33910。它正在以float的形式读入您的数据帧,它以base-2(而不是base-10)计。此后,您看到的任何数字都是float字符串表示形式,仅此而已。

通常,您不应该希望将数字数据转换为字符串。这个过程很昂贵,任何比较都非常昂贵,您将要处理一系列指针,而不是保存在连续内存块中的数据。最后一点是使用Pandas的主要好处,因为它启用了矢量化操作

现在您遇到了核心问题:

  

Id列应完全与csv文件中的方式相同(我想   用它作为过滤器进行搜索)。

您应该使用numpy.isclose比较浮点数。此功能通过设置公差级别来工作,在该公差级别内,两个数字被视为相同。这是一个示例:

s = pd.Series([1.4532400, 67.1234, 54.4556, 765.32414])
res = np.isclose(s, 1.45324)

print(res)
array([ True, False, False, False])

然后过滤您的系列:

s_filtered = s[res]

print(s_filtered)

0    1.45324
dtype: float64

以下是性能比较:

s = pd.Series([1.4532400, 67.1234, 54.4556, 765.32414])
s = pd.concat([s]*100000)
s2 = s.astype(str)

%timeit np.isclose(s, 1.45324)       # 5.02 ms
%timeit s2.astype(str) == '1.45324'  # 79.5 ms