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

Posted

技术标签:

【中文标题】pandas:在多索引数据框中转换索引类型【英文标题】:pandas: convert index type in multiindex dataframe 【发布时间】:2016-03-28 20:14:15 【问题描述】:

您好,有一个多索引数据框:

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)

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

我的尝试:

df1.index.astype(str) 

返回一个类型错误

【问题讨论】:

【参考方案1】:

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')

编辑

您可以使用 multiIndex 的 set_levels 方法设置您的内部级别:

idx = df1.index
df1.index = df1.index.set_levels([idx.levels[:-1], idx.levels[-1].astype(str)])

【讨论】:

这很好,但是我如何更新我的 df1 呢? df1.index.levels[1] = df.index.levels[1].astype(str) 为什么不先reset index再设置index呢? [真正的问题!] 难道编辑应该是df1.index = df1.index.set_levels(idx.levels[:-1] + [idx.levels[-1].astype(str),]) 以允许超过两个级别的索引? 对于多个级别,你可以这样做:df1.index = df1.index.set_levels(idx.levels[-1].astype(int), level=-1) 请注意,levelsastype(str) 都会按字典顺序对各个级别进行排序。这可能会重新排序给定级别的索引标签而不维护 MultiIndex 元组(例如,如果您有索引 1-100,这些将重新排序为 1,10,100,2,20,3...,独立于其他级别)。 【参考方案2】:

我觉得目前的 pandas 实现有点麻烦,所以我用这个:

df1.index = pd.MultiIndex.from_tuples([(ix[0], str(ix[1])) for ix in df1.index.tolist()])

【讨论】:

【参考方案3】:

pandas 发生了变化,旧方法无法正常工作。

对我来说这很有效。

level_to_change = 1
df.index = df.index.set_levels(df.index.levels[level_to_change].astype(int), level=level_to_change)

【讨论】:

【参考方案4】:

聚会很晚,但如果您还想在多索引级别上保留名称,我建议您采取以下措施:

df_ts.index = pd.MultiIndex.from_frame(
    pd.DataFrame(index=df_ts.index)
    .reset_index().astype(int)
    )

同样,如果你有多索引列,你可以使用:

df_ts.columns = pd.MultiIndex.from_frame(
        pd.DataFrame(index=df_ts.columns)
        .reset_index().astype(int)
        )

【讨论】:

以上是关于pandas:在多索引数据框中转换索引类型的主要内容,如果未能解决你的问题,请参考以下文章

在多索引 Python Panda 数据框中过滤多个项目

ValueError 将多索引熊猫数据框转换为 Excel

Pandas 将列多索引转换为行多索引

Pandas - Groupby 多索引级别,获取可能的组合,然后转换数据

如何将带有元组键的 python 字典转换为 pandas 多索引数据框?

熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引