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)
请注意,levels
和 astype(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:在多索引数据框中转换索引类型的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - Groupby 多索引级别,获取可能的组合,然后转换数据