我想导入一个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
希望我已经使自己了解了。我仍在学习如何在这里提问。
谢谢!
答案 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