Pandas 数据框枢轴或堆栈和排序

Pandas dataframe pivot or stack and sort

我正在尝试从数据框中获取摘要数据。

我有大约 500 只股票的表现汇总数据来自这样的代码:

close_prices_normalized = close_prices / close_prices.iloc[0]

head() 看起来像这样:

                 AAL      AAPL       AAP  ...       ZBH      ZION       ZTS
2018-01-10  3.646102  2.568596  1.401648  ...  1.615425  2.168600  2.236309
2018-01-11  3.825085  2.583186  1.431559  ...  1.612261  2.200083  2.256884
2018-01-12  3.964068  2.609861  1.469455  ...  1.609756  2.207125  2.281089

最后一行包含我想要的信息,但我不想横向滚动 500 多列来寻找最高数字 - 我想以编程方式使用这些信息。

所以,我得到了这样的最后一行:

pt = close_prices_normalized.tail(1)

现在,我需要旋转信息,以便符号位于信息旁边的一列中,我需要按值排序。

我知道这个应该简单,但我就是想不通。

我无法使任何版本的 pivot 正常工作,因为我没有它将接受值的列名称。

我试过了

perf_list = pt.stack()
perf_list.head()


2018-02-07  AAL     3.484746
            AAPL    2.351218
            AAP     1.393283
            ABBV    3.134345
            ABC     2.009384
dtype: float64

我不明白为什么日期仍然存在或如何删除它。

这显然不是数据框?

所以,如果我想尝试引用列名,我必须这样做:

stupid = pd.DataFrame(perf_list)
stupid.head()

但是,输出看起来是一样的?

而且,如果我尝试分配列名,它将允许我分配给数字列:

stupid.columns=['perf']

但是,它认为另一列不是列。如果我尝试将列名称分配给两者:

stupid.columns=['symbol','perf']

ValueError: Length mismatch: Expected axis has 1 elements, new values have 2 elements

我已经尝试了各种 .reindex 和 .reset_index 以及各种选项,但我只是在黑暗中拍摄,找不到任何关于如何执行此操作的参考 -简单的事情。

抱歉,如果这只是“太菜鸟”...

IIUC 尝试 reset_index(level=1) after stack 然后重命名列:

import pandas as pd

df = pd.DataFrame({
    'AAL': {'2018-01-10': 3.646102, '2018-01-11': 3.825085,
            '2018-01-12': 3.964068},
    'AAPL': {'2018-01-10': 2.568596, '2018-01-11': 2.583186,
             '2018-01-12': 2.609861},
    'AAP': {'2018-01-10': 1.401648, '2018-01-11': 1.431559,
            '2018-01-12': 1.469455}
})

perf = df.stack().reset_index(level=1)
perf.columns = ['symbol', 'perf']

print(perf)

perf:

           symbol      perf
2018-01-10    AAL  3.646102
2018-01-10   AAPL  2.568596
2018-01-10    AAP  1.401648
2018-01-11    AAL  3.825085
2018-01-11   AAPL  2.583186
2018-01-11    AAP  1.431559
2018-01-12    AAL  3.964068
2018-01-12   AAPL  2.609861
2018-01-12    AAP  1.469455