简体   繁体   English

pandas:在多索引 dataframe 中转换索引类型

[英]pandas: convert index type in multiindex dataframe

Hi have a multiindex dataframe:您好,有一个多索引 dataframe:

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)

How do I convert the inner values of the df's index to str?如何将 df 索引的内部值转换为 str?

My attempt:我的尝试:

df1.index.astype(str) 

returns a TypeError返回一个类型错误

IIUC you need the last level of Multiindex. IIUC 你需要最后一级的 Multiindex。 You could access it with levels :您可以使用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')

EDIT编辑

You could set your inner level with set_levels method of multiIndex:您可以使用set_levels方法设置您的内部级别:

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

There was change in pandas and old way doesn't work properly.大熊猫发生了变化,旧方式无法正常工作。

For me this worked.对我来说这有效。

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

我发现当前的 Pandas 实现有点麻烦,所以我使用了这个:

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

Very late to the party, but if you also want to maintain the names on your multi-index levels, I'd suggest the following:聚会很晚,但如果您还想在多索引级别上维护名称,我建议如下:

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

Similarly if you have multi-index columns, you can use:同样,如果您有多索引列,则可以使用:

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

Maybe not that elegant as last solution though it will set column names dtype to str for all multi-index levels (when df.columns is a multi-index):尽管它将所有多索引级别的列名 dtype 设置为 str (当 df.columns 是多索引时),但可能不如最后一个解决方案那么优雅:

df.columns = [df.columns.get_level_values(i).astype(str) for i in range(len(df.columns.levels)

Hope this helps too.希望这也有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM