熊猫读csv作为字符串类型

dav*_*ver 31 python pandas

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

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

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

数据框看起来像:

           A         B
1A  0.209059  0.275554
1B  0.742666  0.721165
Run Code Online (Sandbox Code Playgroud)

然后我就这样读了:

df_read = pd.read_csv(savefile, dtype=str, index_col=0)
Run Code Online (Sandbox Code Playgroud)

结果是:

   A  B
B  (  <
Run Code Online (Sandbox Code Playgroud)

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

And*_*den 36

更新:这已得到修复:从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
Run Code Online (Sandbox Code Playgroud)

或者更好,只是不要指定一个dtype:

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

但绕过类型嗅探器并真正返回字符串需要使用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
Run Code Online (Sandbox Code Playgroud)

其中100一些数字等于或大于您的总列数.

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

  • 设置`dtype`是不够的.例如,`df.applymap(lambda x:x.strip())`抛出错误`AttributeError :("'float'对象没有属性'strip'",'发生在索引A')`因为pandas强迫`在路上的某个地方```浮动`. (3认同)

Chr*_*lan 10

像安东吨他的评论说,pandas会随机变成object类型为float使用它的类型嗅探器的类型,即使你通过dtype=objectdtype=strdtype=np.str

因为你可以传递一个函数字典,其中键是一个列索引,值是一个转换器函数,你可以做这样的事情(例如,100 列)。

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

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