59

我有一个带有字母数字键的数据框,我想将其保存为 csv 并稍后读回。由于各种原因,我需要将此键列显式读取为字符串格式,我有严格数字的键,甚至更糟,例如:1234E5,Pandas 将其解释为浮点数。这显然使密钥完全无用。

问题是当我为数据框或其任何列指定字符串 dtype 时,我只会得到垃圾。我在这里有一些示例代码:

df = pd.DataFrame(np.random.rand(2,2),
                  index=['1A', '1B'],
                  columns=['A', 'B'])
df.to_csv(savefile)

数据框如下所示:

           A         B
1A  0.209059  0.275554
1B  0.742666  0.721165

然后我这样读:

df_read = pd.read_csv(savefile, dtype=str, index_col=0)

结果是:

   A  B
B  (  <

这是我的电脑问题,还是我在这里做错了什么,或者只是一个错误?

4

5 回答 5

61

更新:这已得到修复:从 0.11.1 开始,您传递str/np.str将等同于使用object.

使用对象 dtype:

In [11]: pd.read_csv('a', dtype=object, index_col=0)
Out[11]:
                      A                     B
1A  0.35633069074776547     0.745585398803751
1B  0.20037376323337375  0.013921830784260236

或者更好的是,只是不指定 dtype:

In [12]: pd.read_csv('a', index_col=0)
Out[12]:
           A         B
1A  0.356331  0.745585
1B  0.200374  0.013922

但是绕过类型嗅探器并真正返回字符串需要一个 hacky 使用converters

In [13]: pd.read_csv('a', converters={i: str for i in range(100)})
Out[13]:
                      A                     B
1A  0.35633069074776547     0.745585398803751
1B  0.20037376323337375  0.013921830784260236

其中100某个数字等于或大于您的总列数。

最好避免使用 str dtype,例如参见此处

于 2013-06-07T16:14:05.277 回答
10

pandas就像Anton Tobject在他的评论中所说的那样float,即使您通过dtype=object,dtype=strdtype=np.str.

由于您可以传递一个函数字典,其中键是列索引,值是转换器函数,因此您可以执行类似的操作(例如,对于 100 列)。

pd.read_csv('some_file.csv', converters={i: str for i in range(0, 100)})

range(0, N)如果您不知道要读取多少列,您甚至可以传递比列数大得多的 N。

于 2018-09-03T22:54:38.200 回答
5
于 2021-05-01T21:17:46.423 回答
4

如果您事先不知道列,请使用适用于任何列的转换器:

import pandas as pd

class StringConverter(dict):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return str

    def get(self, default=None):
        return str

pd.read_csv(file_or_buffer, converters=StringConverter())
于 2019-04-10T23:06:47.610 回答
0

上述许多答案都很好,但既不优雅也不通用。如果您想将所有列作为字符串读取,您可以使用以下构造而不关心列数。

from collections import defaultdict
import pandas as pd

pd.read_csv(file_or_buffer, converters=defaultdict(lambda i: str))

defaultdict返回str传入的每个索引converters

于 2020-08-18T11:52:33.080 回答