按行业分组并按总资产排序后计算pr_multi相关矩阵遇序乱问题
问题
我手里有11个行业共100家公司的数据,想先按行业分组,每个行业内按总资产(atq)降序排序,再计算pr_multi的相关系数矩阵。但执行排序和groupby操作后,结果总是按字母顺序排列,没法保留我设定的排序逻辑。
数据样例
| index | datafqtr | tic | pr_multi | atq | industry |
|---|---|---|---|---|---|
| 0 | 2018Q1 | A | NaN | 8698.0 | 4 |
| 1 | 2018Q2 | A | -0.0856845728151735 | 8784.0 | 4 |
| 2 | 2018Q3 | A | 0.0035103320774146 | 8349.0 | 4 |
| 3 | 2018Q4 | A | -0.0157732687260246 | 8541.0 | 4 |
| 4 | 2018Q1 | AAL | NaN | 53280.0 | 5 |
| 5 | 2018Q2 | AAL | -0.2694380292532717 | 52622.0 | 5 |
当前使用的代码
data1=data18.sort_values(['atq'],ascending=False).groupby('industry').head() df = data1.pivot_table('pr_multi', ['datafqtr'], 'tic') # 用pandas内置函数计算相关系数矩阵 correlation_matrix = df.corr() correlation_matrix.head()
解决方案
- 问题出在两点:
groupby('industry').head()不会保留分组内的排序结果;后续pivot_table会默认按tic的字母顺序排列列,最终导致相关矩阵顺序不符合预期。 - 修正步骤:
- 先按行业分组,在每个组内单独按
atq降序排序,同时保留排序后的顺序:# 分组后每个行业内按atq降序排序,重置索引避免混乱 data1 = data18.groupby('industry', group_keys=False).apply(lambda x: x.sort_values('atq', ascending=False)).reset_index(drop=True) - 提取去重后的
tic列表,这个列表会保留行业内按atq降序的顺序:sorted_tics = data1['tic'].drop_duplicates().tolist() - 生成透视表时,指定列顺序为刚才得到的
sorted_tics,确保列的排序符合要求:df = data1.pivot_table('pr_multi', index='datafqtr', columns='tic')[sorted_tics] - 再计算相关系数矩阵,此时矩阵的行和列都会严格遵循你设定的排序逻辑:
correlation_matrix = df.corr() correlation_matrix.head()
- 先按行业分组,在每个组内单独按
- 额外提示:如果需要把相关矩阵按行业分组展示,可以基于
sorted_tics和行业对应关系,重新调整矩阵的行和列顺序。
内容的提问来源于stack exchange,提问作者hilo
相关产品推荐
相关产品推荐

