36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
import pandas as pd
|
|
def sort_matrix_by_diag (rotated_components_df):
|
|
# 调整因子列顺序:按方差解释降序排列
|
|
variance_explained = (rotated_components_df ** 2).sum()
|
|
column_order = variance_explained.sort_values(ascending=False).index.tolist()
|
|
rotated_components_df = rotated_components_df[column_order]
|
|
|
|
# 对载荷矩阵进行排序
|
|
sorted_loadings = rotated_components_df.copy()
|
|
|
|
# 确定每个变量的主因子(绝对值最大的列)
|
|
sorted_loadings['主因子'] = sorted_loadings.abs().idxmax(axis=1)
|
|
|
|
# 将主因子转换为按列顺序的分类变量,确保排序正确
|
|
sorted_loadings['主因子'] = pd.Categorical(
|
|
sorted_loadings['主因子'],
|
|
categories=column_order,
|
|
ordered=True
|
|
)
|
|
|
|
# 提取每个变量在其主因子上的载荷绝对值
|
|
sorted_loadings['绝对值'] = sorted_loadings.apply(
|
|
lambda row: abs(row[row['主因子']]),
|
|
axis=1
|
|
)
|
|
|
|
# 按主因子顺序和绝对值降序排序
|
|
sorted_loadings = sorted_loadings.sort_values(
|
|
by=['主因子', '绝对值'],
|
|
ascending=[True, False]
|
|
)
|
|
|
|
# 删除临时列并输出结果
|
|
sorted_loadings = sorted_loadings.drop(['主因子', '绝对值'], axis=1)
|
|
|
|
return sorted_loadings |