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