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
我正在尝试从数据框中获取摘要数据。
我有大约 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