熊猫读csv作为字符串类型

时间:2013-06-07 16:09:33

标签: python pandas

我有一个带字母数字键的数据框,我希望将其保存为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  (  <

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

5 个答案:

答案 0 :(得分:34)

更新:这有been fixed:从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

但绕过类型嗅探器并真正返回字符串需要使用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,例如参见here

答案 1 :(得分:2)

如今,(pandas==1.0.5) 可以正常工作。

pd.read_csv(f, dtype=str) 会将除 NAN 值以外的所有内容作为字符串读取(empty string, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’ 如果您不希望将此字符串解析为 NAN 使用 na_filter=False

答案 2 :(得分:1)

就像安东·T(Anton T)在评论中说的那样,即使您通过pandas,{{1},object也会使用其类型嗅探器将float类型随机转换为dtype=object类型}或dtype=str

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

dtype=np.str

如果您不知道要读取多少列,甚至可以通过pd.read_csv('some_file.csv', converters={i: str for i in range(0, 100)}) 传递N,该N比列数大得多。

答案 3 :(得分:1)

如果您不了解列,请使用适用于任何列的转换器:

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())

答案 4 :(得分:1)

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

from collections import defaultdict
import pandas as pd

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

defaultdict将为传递到str的每个索引返回converters