我有一个带字母数字键的数据框,我想将其保存为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,例如请参见此处.
jul*_*esl 23
如今,(pandas==1.0.5) 它就可以工作了。
\npd.read_csv(f, dtype=str)会将所有内容读取为字符串(NAN 值除外)。
如果您不希望将此字符串解析为 NAN 使用na_filter=False
Chr*_*lan 10
像安东吨他的评论说,pandas会随机变成object类型为float使用它的类型嗅探器的类型,即使你通过dtype=object,dtype=str或dtype=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。
| 归档时间: |
|
| 查看次数: |
63560 次 |
| 最近记录: |