我有一个带有MultiIndex的DataFrame,我想将其转换为utf8。有没有一个技巧可以让你按照df.index = df.index.str.decode('iso-8859-1').str.encode('utf-8')
的方式做一些事情(适用于单级索引,但不适用于MultiIndexes)?
答案 0 :(得分:2)
str
方法确实只适用于单个级别,而不适用于多指数。所以我认为处理这个问题有两种方法:a)检索单个级别,更改它们,重建多索引,或b)将其作为列进行处理(通过重置索引,然后将其设置回来。) p>
为示例使用虚拟数据框:
In [6]: df = pd.DataFrame({'a':[1,2,3], 'b':['é', 'a', 'b'], 'c':[0.1,0.2,0.3]})
In [7]: df = df.set_index(['a', 'b'])
In [8]: df
Out[8]:
c
a b
1 é 0.1
2 a 0.2
3 b 0.3
对于a),您可以使用get_level_values
将各个级别作为索引对象:
In [12]: levels = [df.index.get_level_values(i) for i in range(df.index.nlevels)]
In [13]: levels
Out[13]:
[Int64Index([1, 2, 3], dtype='int64', name=u'a'),
Index([u'é', u'a', u'b'], dtype='object', name=u'b')]
In [14]: levels[1] = levels[1].str.decode('iso-8859-1').str.encode('utf-8')
In [16]: df.index = pd.MultiIndex.from_arrays(levels)
或者对于b),重置索引并在之后重新设置:
In [27]: temp = df.reset_index()
In [29]: temp['b'] = temp['b'].str.decode('iso-8859-1').str.encode('utf-8')
In [30]: df = temp.set_index(['a', 'b'])