pandas:在多索引数据帧中转换索引类型

Boo*_*d16 14 python types multi-index pandas

您有一个多索引数据框:

tuples = [('YTA_Q3', 1), ('YTA_Q3', 2), ('YTA_Q3', 3), ('YTA_Q3', 4), ('YTA_Q3', 99), ('YTA_Q3', 96)]
# Index
index = pd.MultiIndex.from_tuples(tuples, names=['Questions', 'Values'])
# Columns
columns = pd.MultiIndex.from_tuples([('YTA_Q3', '@')], names=['Questions', 'Values'])
# Data
data = [29.014949,5.0260590000000001,
  6.6269119999999999,
  1.3565260000000001,
  41.632221999999999,
  21.279499999999999]

df1 = pd.DataFrame(data=data, index=index, columns=columns)
Run Code Online (Sandbox Code Playgroud)

如何将df索引的内部值转换为str?

我的尝试:

df1.index.astype(str) 
Run Code Online (Sandbox Code Playgroud)

返回TypeError

Ant*_*pov 17

IIUC你需要最后一级Multiindex.你可以用以下方式访问它levels:

df1.index.levels[-1].astype(str)

In [584]: df1.index.levels[-1].astype(str)
Out[584]: Index(['1', '2', '3', '4', '96', '99'], dtype='object', name='Values')
Run Code Online (Sandbox Code Playgroud)

编辑

您可以使用set_levelsmultiIndex方法设置内部级别:

idx = df1.index
df1.index = df1.index.set_levels([idx.levels[:-1], idx.levels[-1].astype(str)])
Run Code Online (Sandbox Code Playgroud)

  • 对于多个级别,您可以执行以下操作:`df1.index = df1.index.set_levels(idx.levels[-1].astype(int), level=-1)` (5认同)
  • 这很好,但是如何更新df1?df1.index.levels [1] = df.index.levels [1] .astype(str) (2认同)
  • 难道编辑应该是`df1.index = df1.index.set_levels(idx.levels[:-1] + [idx.levels[-1].astype(str),])`以允许超过两个级别的索引? (2认同)
  • 请注意,“levels”和“astype(str)”都会*按字典顺序*对各个级别进行排序。这可能会重新排序给定级别的索引标签,而无需维护 MultiIndex 元组(例如,如果您有索引 1-100,这些索引将被重新排序为 1,10,100,2,20,3...,独立于其他级别)。 (2认同)

Jso*_*owa 5

大熊猫发生了变化,旧方式无法正常工作。

对我来说这有效。

level_to_change = 1
df.index = df.index.set_levels(df.index.levels[level_to_change].astype(int), level=level_to_change)
Run Code Online (Sandbox Code Playgroud)