如何优化自定义PCA函数以消除分组后多余索引列
解决方案
修改你的自定义PCA函数,确保返回和输入组数据索引对齐的一维Series,就能避免多余空索引的问题:
import scipy.stats as stats import numpy as np import pandas as pd def pca(data): try: x = stats.zscore(data, nan_policy='omit') covar = np.cov(x, rowvar=False) eigval, eigvec = np.linalg.eig(covar) except Exception as e: # 返回与输入数据索引完全对齐的NaN序列 return pd.Series([np.NaN]*len(data), index=data.index) else: # 把二维计算结果转为一维,再生成带原索引的Series pca_result = (x @ eigvec[:, :1]).flatten() return pd.Series(pca_result, index=data.index)
关键修改说明
- 异常分支:给返回的NaN序列指定了输入数据的索引,保证分组后结果能和原数据精准对齐,不会乱序。
- 正常分支:矩阵乘法原本会得到(n,1)的二维数组,用
flatten()压成一维后再转成Series,避免返回二维结构(比如单列DataFrame)导致的多余索引层级。
调用方式
用transform替代apply,直接得到和原数据集索引对齐的结果,形式和groupby['col'].transform('mean')完全一致:
sam['pca_first_component'] = sam.groupby('gvkey')[['xgat', 'xgsale', 'xcap']].transform(pca)
这样处理后,结果会直接作为新列添加到原数据中,不会出现多余的空索引列。
内容的提问来源于stack exchange,提问作者PTQuoc
相关产品推荐
相关产品推荐

