在链操作中重命名DataFrame的索引



我正试图对我的数据进行Jarque-Bera-Bera检验(正态性检验(,这些数据看起来像(链式操作后(:

Data:
ranking Q1  Q2  Q3  Q4
Date                
2009-12-29  nan nan nan nan
2009-12-30  0.12    -0.21   -0.36   -0.39
2009-12-31  0.05    0.09    0.06    -0.02
2010-01-01  nan nan nan nan
2010-01-04  1.45    1.90    1.81    1.77
... ... ... ... ...
2020-10-13  -0.67   -0.59   -0.63   -0.61
2020-10-14  -0.05   -0.12   -0.05   -0.13
2020-10-15  -1.91   -1.62   -1.78   -1.91
2020-10-16  1.21    1.13    1.09    1.37
2020-10-19  -0.03   0.01    0.06    -0.02

我使用这样的函数:

(data
.sort_values('Date')
.groupby([pd.Grouper(key='Date', freq='B'), 'ranking'])
['perf_corr']
.apply(lambda x: x.mean()*100)
.unstack()
.agg([lambda x: x.mean(),
lambda x: np.sqrt(x.var()),
lambda x: x.skew(),
lambda x: x.kurtosis(),
])
)

输出为:

Q1  Q2  Q3  Q4
<lambda>    8.89    9.20    7.63    7.30
<lambda>    15.77   16.19   16.93   17.59
<lambda>    -1.04   -0.95   -0.79   -0.61
...

我的问题很简单,如何替换为"mean"、"std"、,。。。(我也计算其他函数(在我的链计算中?在新的pandas版本之前,lambda函数是<lambda_1>,。。。所以我用了

.rename(index={'lambda_1': "mean"})

但现在已经不可能了

有继续的想法吗?

我还发现了一个解决方案:

data.set_axis(['mean','std'],axis='index')

它的工作原理是

解决方案

在管道之前列出所需的行名:

idx_names = ["mean", "std", "skew", "kurtosis"]  # can be more

并在.agg()之后将其链接

.reset_index(drop=True).rename(dict(zip(range(len(idx_names)), idx_names)))

解释

将索引恢复为[0,1,2,…],并创建一个字典,将这些数字映射到所需的列名。映射字典看起来像上面示例中的{0: "mean, 1: "std", 2: "skew", 3: "kurtosis"}

最新更新