Python 3.x 带字符串列的HDFStore出现问题

Python 3.x 带字符串列的HDFStore出现问题,python-3.x,pandas,pytables,Python 3.x,Pandas,Pytables,我有一个pandas数据框myDF,有几个字符串列(其dtype为object)和许多数字列。我尝试了以下方法: d=pandas.HDFStore(“C:\\PF\\Temp.h5”) d['test']=myDF 我得到了这个结果: C:\PF\WinPython-64bit-3.3.3\python-3.3.amd64\lib\site packages\pandas\io\pytables.py:2446:PerformanceWarning: 您的性能可能会受到影响,因为PyTabl

我有一个pandas数据框
myDF
,有几个字符串列(其
dtype
object
)和许多数字列。我尝试了以下方法:

d=pandas.HDFStore(“C:\\PF\\Temp.h5”)
d['test']=myDF
我得到了这个结果:

C:\PF\WinPython-64bit-3.3.3\python-3.3.amd64\lib\site packages\pandas\io\pytables.py:2446:PerformanceWarning:
您的性能可能会受到影响,因为PyTables将pickle它无法处理的对象类型
直接映射到c类型[推断的\u类型->混合,键->块2\u值]
[项目->[0,1,3,4,5,6,9,10292,…]
警告。警告(ws,性能警告)
似乎每个字符串列都出现了问题。例如,如果我尝试

myDF[0].dtype
我明白了

Out[38]:数据类型('O')
如何解决此问题,即更改字符串列的
dtype
,以便HDFStore可以将其视为字符串列


编辑

更多信息请按要求提供

>>> pandas.__version__
Out[49]: '0.13.1'

>>> tables.__version__
Out[53]: '3.1.0'
按如下方式构建熊猫数据帧:

pandas.read_csv(fName,sep=“|”,header=None,low_memory=False)
当我尝试

myDF.info()
我明白了

int64索引:153895个条目,0到153894
数据列(共644列):
0对象
1对象
2 int64
3对象
4对象
5对象
6对象
7 int64
8.64
9对象
10对象
11.64
12.64
...
...
642浮动64
643浮动64
数据类型:float64(619)、int64(2)、object(23)

所有字符串列都已被读取为
对象

只有在列中存在混合类型时,才会出现此警告。不仅仅是字符串,还有字符串和数字

In [2]: DataFrame({ 'A' : [1.0,'foo'] }).to_hdf('test.h5','df',mode='w')
pandas/io/pytables.py:2439: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block0_values] [items->['A']]

  warnings.warn(ws, PerformanceWarning)

In [3]: df = DataFrame({ 'A' : [1.0,'foo'] })

In [4]: df
Out[4]: 
     A
0    1
1  foo

[2 rows x 1 columns]

In [5]: df.dtypes
Out[5]: 
A    object
dtype: object

In [6]: df['A']
Out[6]: 
0      1
1    foo
Name: A, dtype: object

In [7]: df['A'].values
Out[7]: array([1.0, 'foo'], dtype=object)
因此,您需要确保不在列中混合

如果有需要转换的列,可以执行以下操作:

In [9]: columns = ['A']

In [10]: df.loc[:,columns] = df[columns].applymap(str)

In [11]: df
Out[11]: 
     A
0  1.0
1  foo

[2 rows x 1 columns]

In [12]: df['A'].values
Out[12]: array(['1.0', 'foo'], dtype=object)

你能显示pandas版本、pytables版本、os、df.info()、df是如何构造的以及一个示例吗?你为什么要传递
低内存
?您是否在任何字符串中使用unicode?因为文件太大,并且没有
低内存,所以它似乎无法工作。以下是错误
C:\PF\WinPython-64bit-3.3.3\python-3.3.amd64\lib\site packages\pandas\io\parsers.py:1070:DtypeWarning:Columns(6292479572581590599608617626635)具有混合类型。在导入时指定dtype选项或将低内存设置为False。data=self.\u reader.read(nrows)
ok,您是32位的吗?按块读入,并创建一个
存储。不,我是64位的。请参阅上面的错误。另外,你所说的
存储是什么意思?在
read_csv
中是否有任何选项可以指定它在任何列显示为混合列时将其视为字符串?我尝试了
df.loc[:,columns]=df[columns].applymap(str)
,但它没有将
dtype
对象改为字符串。即使在您的示例中,
dtype
也不会从
object
更改为stringdtype,它仍然是
object
。嵌入的值将是字符串。这就是问题所在。在您正在读取的数据中,嵌入的对象是float/int(实际的python对象),而不是字符串。因此,当帧被写入存储时,它们是对象,而不是空白的字符串(这就是为什么会得到警告),或者NaN,这将输出NaN作为字符串,实际显示在文件中(不需要)。我应该用np.nan替换它们,还是这会导致列再次成为对象?或者我应该用fillna(‘Blank’)还是什么?这似乎会占用空间,但我还是有很多空间。