没有方法重命名Pandas索引名称(而不是标签)内联?

mbzjlibv  于 2022-12-21  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个 Dataframe bmi,可以这样总结:

现在,我想基于十年内测量的Age值总结 Dataframe ,因此我执行以下操作:

bmi.groupby(by=bmi.Age//10).describe().stack()

它显示了以下摘要:

请注意,这将创建一个名为Age的索引,我更愿意将其命名为Decade。在生成 Dataframe 期间,如何重命名此索引的名称(准确地说,索引级别)?
所以我在寻找一个函数which_func(),这样我的代码就可以读起来像这样:

bmi.groupby(by=bmi.Age//10).describe().which_func({'Age':'Decade'}).stack()

我得到了输出结果

我能想到的最短的单行版本是:

bmi.groupby(by=bmi.Age//10).describe().reset_index(level='Age', names='Decades').set_index('Decades').stack()

这似乎是多余的。
内置方法DataFrame.rename()重命名索引的标签,而不是它的名称,其他方法需要提取索引或它们的名称,然后重命名,覆盖它们,这样代码就不能被链接。
考虑到这是groupby()-aggregate()设置中非常常见的情况,真的没有办法用链式代码来实现这一点吗?

js5cn81o

js5cn81o1#

您要查找的是rename_axis()

>>> bmi.groupby(by=bmi.Age//10).describe().rename_axis(index={'Age': 'Decade'}).stack()
                Bodyfat        Age     Weight
Decade                                       
1.0    count   9.000000   9.000000   9.000000
       mean   30.779899  16.981942  32.795294
       std     4.341956   1.415877   5.292009
       min    24.080597  14.769285  24.887466
       25%    27.655679  16.137036  30.101671
...                 ...        ...        ...
4.0    min    27.594864  41.519583  24.699921
       25%    27.594864  41.519583  24.699921
       50%    27.594864  41.519583  24.699921
       75%    27.594864  41.519583  24.699921
       max    27.594864  41.519583  24.699921

对于上述实际结果,我们使用了以下可重现示例

# minimal example
import numpy as np  # only needed to create the example frame

np.random.seed(0)
bmi = pd.DataFrame(np.random.normal(30, 5, size=(250, 3)),
                   columns='Bodyfat Age Weight'.split())

以下形式都是等效的:

bmi.groupby(by=bmi.Age//10).describe().rename_axis(index='Decade').stack()

bmi.groupby(by=bmi.Age//10).describe().rename_axis('Decade', axis=0).stack()

bmi.groupby(by=bmi.Age//10).describe().stack().rename_axis(index={'Age': 'Decade'})

(the最后一个示例显示rename_axis()可以在.stack()之后调用,这意味着它也可以在MultiIndex上使用)。
当然,您也可以在groupby之前派生一个新变量Decade

>>> bmi.assign(Decade=bmi['Age']//10).groupby('Decade').describe().stack()
                Bodyfat        Age     Weight
Decade                                       
1.0    count   9.000000   9.000000   9.000000
       mean   30.779899  16.981942  32.795294
       std     4.341956   1.415877   5.292009
       min    24.080597  14.769285  24.887466
       25%    27.655679  16.137036  30.101671
...                 ...        ...        ...
4.0    min    27.594864  41.519583  24.699921
       25%    27.594864  41.519583  24.699921
       50%    27.594864  41.519583  24.699921
       75%    27.594864  41.519583  24.699921
       max    27.594864  41.519583  24.699921

相关问题