Python 熊猫-导入CSV问题-在末尾添加和删除0

Python 熊猫-导入CSV问题-在末尾添加和删除0,python,pandas,csv,floating-point,series,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\u csv导入它时。Id列应该与cs

我想导入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\u csv导入它时。Id列应该与csv文件中的完全相同(我想将其用作进行搜索的过滤器)。但熊猫正在回归,就像:

当我在不改变结构的情况下导入时(自动将列转换为float)

导入数据集并将id列转换为类型(str)时:

它正在删除和添加0。 我真的不知道如何让熊猫进口真实的数量

>17980876.8560
希望我已经明白了。我还在这里学习如何提问


谢谢

首先,您应该了解熊猫不是以十进制形式读取您的数字
17980873.33910
。它以
浮点数
的形式将其读入数据帧,该浮点数以基数2计,而不是以基数10计。此后,您看到的任何数字都是
浮点数的字符串表示形式,仅此而已

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

现在谈谈你的核心问题:

Id列应该与csv文件中的列完全相同(我想 将其用作筛选器以执行搜索)

您应该使用来比较浮动。此功能通过设置公差级别来工作,在公差级别内,两个数字被视为相同。下面是一个例子:

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

Id
dtype
设置为
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
使用:

要获得:

         Data             Id         Text
0  2018-06-11  17980873.3391  bla bla bla
1  2018-06-11  17980874.4560  bla bla bla
2  2018-06-11  17980876.8560  bla bla bla

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

当您使用
导入数据时,read_csv()
,使用带有dict的
dtype
选项将“ID”列的数据类型设置为
对象。请参阅文档:@smj,抱歉,这是个坏主意。有比读取字符串更好的方法来比较浮点。鉴于OP将
17980873.3391
视为一个数字而不是一个类别,我只能相信它应该被视为一个数字。关于
str
与float的另一个注释。如果一个“ID”字段有“111.500”、“111.50”和“111.5”,那么这些字段将与浮点数相同,但与字符串不同。因此,对于OP,使用float会更快,但如果ID中的零是重要的,则不正确。只是需要注意一些事情。@jpp我同意你的观点,如果它是一个浮点,那么最好将它作为一个浮点处理,并使用
isclose()
。我以前没见过,所以谢谢你的信息!如果它实际上是一个ID,那么最好将
上的列拆分,并将它们存储为
int
。可能对分组非常有用…@jpp同意,我们并不总是从新用户那里得到完整的信息,所以我想指出可能存在的问题。谢谢!我一定会在代码中遵循您的提示。乍一看,我用dtype参数修复了它。但我现在要尝试实现isclose参数。
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)
         Data             Id         Text
0  2018-06-11  17980873.3391  bla bla bla
1  2018-06-11  17980874.4560  bla bla bla
2  2018-06-11  17980876.8560  bla bla bla