pandas: 转换多索引数据帧中的索引类型
pandas: convert index type in multiindex 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)
如何将 df 索引的内部值转换为 str?
我的尝试:
df1.index.astype(str)
returns 类型错误
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)])
我发现当前的 pandas 实现有点麻烦,所以我使用这个:
df1.index = pd.MultiIndex.from_tuples([(ix[0], str(ix[1])) for ix in df1.index.tolist()])
pandas 发生了变化,旧方法无法正常工作。
对我来说这很有效。
level_to_change = 1
df.index = df.index.set_levels(df.index.levels[level_to_change].astype(int), level=level_to_change)
派对已经很晚了,但如果您还想保持 multi-index 级别的名称,我建议如下:
df_ts.index = pd.MultiIndex.from_frame(
pd.DataFrame(index=df_ts.index)
.reset_index().astype(int)
)
同样,如果您有 multi-index 列,您可以使用:
df_ts.columns = pd.MultiIndex.from_frame(
pd.DataFrame(index=df_ts.columns)
.reset_index().astype(int)
)
你好,有一个多索引数据框:
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)
returns 类型错误
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)])
我发现当前的 pandas 实现有点麻烦,所以我使用这个:
df1.index = pd.MultiIndex.from_tuples([(ix[0], str(ix[1])) for ix in df1.index.tolist()])
pandas 发生了变化,旧方法无法正常工作。
对我来说这很有效。
level_to_change = 1
df.index = df.index.set_levels(df.index.levels[level_to_change].astype(int), level=level_to_change)
派对已经很晚了,但如果您还想保持 multi-index 级别的名称,我建议如下:
df_ts.index = pd.MultiIndex.from_frame(
pd.DataFrame(index=df_ts.index)
.reset_index().astype(int)
)
同样,如果您有 multi-index 列,您可以使用:
df_ts.columns = pd.MultiIndex.from_frame(
pd.DataFrame(index=df_ts.columns)
.reset_index().astype(int)
)