提问人:daver 提问时间:6/8/2013 最后编辑:sophrosdaver 更新时间:3/3/2023 访问量:178405
Pandas 将 csv 读取为字符串类型
Pandas reading csv as string type
问:
我有一个带有字母数字键的数据框,我想将其保存为 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 ( <
这是我的电脑有问题,还是我在这里做错了什么,或者只是一个错误?
答:
更新:此问题已修复:从 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,例如,请参阅此处。
评论
read_csv
str
object
dtype=object
dtype
df.applymap(lambda x: x.strip())
AttributeError: ("'float' object has no attribute 'strip'", 'occurred at index A')
object
float
就像 Anton T 在他的评论中所说的那样,将使用其类型嗅探器随机将类型转换为类型,即使您传递 、 或 .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)})
如果您不知道将读取多少列,您甚至可以传递比列数大得多的 N。range(0, N)
评论
如果您事先不知道任何列,请使用适用于任何列的转换器:
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())
上面的许多答案都很好,但既不是很优雅,也不是很普遍。如果要将所有列读取为字符串,则可以使用以下构造,而无需关心列数。
from collections import defaultdict
import pandas as pd
pd.read_csv(file_or_buffer, converters=defaultdict(lambda i: str))
对于传递到的每个索引,将返回 。defaultdict
str
converters
评论
pandas
如今,(pandas==1.0.5)它只是工作。
pd.read_csv(f, dtype=str)
将所有内容读取为字符串,但 NAN 值除外。
以下是将解析为 NAN 的值列表:空字符串、'#N/A'、'#N/A N/A'、'#NA'、'-1.#IND'、'-1.#QNAN'、'-NaN'、'-nan'、 '1.#IND', '1.#QNAN', '', '不适用', '不适用', '不适用', '不适用', '不适用', 'nan', 'null'
如果您不希望此字符串被解析为 NAN,请使用na_filter=False
评论