更改pandas MultiIndex的字符串编码

时间:2015-12-06 21:50:57

标签: python pandas unicode

我有一个带有MultiIndex的DataFrame,我想将其转换为utf8。有没有一个技巧可以让你按照df.index = df.index.str.decode('iso-8859-1').str.encode('utf-8')的方式做一些事情(适用于单级索引,但不适用于MultiIndexes)?

1 个答案:

答案 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'])