将字符串转换为整数Pandas数据帧索引

5

我有一个带有多级索引的pandas数据框。不幸的是,其中一个索引以字符串形式给出年份

例如:'2010','2011'

如何将它们转换为整数?

更具体地说

MultiIndex(levels=[[u'2010', u'2011'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
       labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
 10, 11, 12, , ...]], names=[u'Year', u'Month'])

.

df_cbs_prelim_total.index.set_levels(df_cbs_prelim_total.index.get_level_values(0).astype('int'))

看起来可以做到,但不是就地修改。有没有更合适的方法可以更改它们?
祝好, 迈克

1
你能在分配给索引之前将它们转换吗?这似乎是最不痛苦的方法。 - EdChum
1个回答

3

在将其分配为索引之前(如@EdChum所指出的那样),这样做可能更加清晰,但是当您已经将其作为索引时,确实可以使用set_levels来更改多级索引的级别标签之一。与您的代码相比稍微更加简洁(您可以使用index.levels[..]):

In [165]: idx = pd.MultiIndex.from_product([[1,2,3], ['2011','2012','2013']])

In [166]: idx
Out[166]:
MultiIndex(levels=[[1, 2, 3], [u'2011', u'2012', u'2013']],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])

In [167]: idx.levels[1]
Out[167]: Index([u'2011', u'2012', u'2013'], dtype='object')    

In [168]: idx = idx.set_levels(idx.levels[1].astype(int), level=1)

In [169]: idx
Out[169]:
MultiIndex(levels=[[1, 2, 3], [2011, 2012, 2013]],
           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])

您需要重新分配它以保存更改(就像上面所做的那样,在您的情况下,这将是df_cbs_prelim_total.index = df_cbs_prelim_total.index.set_levels(...)


请注意,pandas MultiIndex 的 levels 方法似乎按字典顺序排序各个层级(即使这些层级是整数类型)。 这可能会重新排序给定级别的索引标签,而不维护MultiIndex元组(例如,如果您具有1-100的索引,它们将被重新排序为1、10、100、2、20、3...与其他级别无关)。 在这种情况下,应在 set_levels() 中明确对转换后的索引进行排序。在上面的示例中(输入单元格[168]):idx = idx.set_levels(idx.levels[1].astype(int).sort_values(), level=1) - onietosi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接