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

问题描述 投票:0回答:6

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

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) 

返回类型错误

python pandas types multi-index
6个回答
40
投票

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

18
投票

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

对我来说这很有效。

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

3
投票

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

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


2
投票

聚会已经很晚了,但如果您还想保留多索引级别上的名称,我建议如下:

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

1
投票

也许不像最后一个解决方案那么优雅,尽管它将所有多索引级别的列名 dtype 设置为 str (当 df.columns 是多索引时):

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

希望这也有帮助。


0
投票

基于名称的方式任意数量的索引级别设置任意数据类型组合的一种方法如下

# define your desired target index schema as a dict (name, and dtype), allowing any number of columns and dtypes
my_index_schema: Dict[str, str] = {'country': 'str', 'indep_day': 'datetime64[ns]', 'population': 'int'}

# get the MultiIndex of the current df, make it a frame, and set the desired dtypes
new_index_frame = df.index.to_frame().astype(my_index_schema)

# overwrite the current index of df by the new index (converted to MultiIndex)
df.index = pd.MultiIndex.from_frame(new_index_frame)

这里所有其他答案的缺点是它们要么是基于“level-number”的(所以你必须希望你想要设置为“dtype”的索引级别恰好位于硬编码位置X,说“3”),或者他们为所有索引级别设置相同的数据类型。上面基于字典的版本克服了这两个问题。

© www.soinside.com 2019 - 2024. All rights reserved.