【发布时间】:2020-08-13 22:59:54
【问题描述】:
我正在尝试重组 pandas df。我有股票代码名称为“SPY”、“JPM”、“AAPL”、“GLD”的列,每列都有调整后的收盘数据。我正在索引日期。我想创建一个多索引df,其中名称为第一级,日期为第二级。我用一种丑陋的迂回方式完成了这一点,但很好奇我是否可以使用枢轴或其他东西来完成这一点。我一直在查看 PD 通用功能和 PD df reshape 文档,但我似乎无法将这些点联系起来以了解如何解决这个问题。
这是我完成此任务的方法,但看起来很脏,想知道是否有更清洁的方法来完成此任务。
>>>sym_df = get_data(symbol, pd.date_range(sd, ed)) # automatically adds SPY
>>>print(sym_df)
SPY JPM AAPL GLD
2010-01-04 108.27 40.87 213.10 109.80
2010-01-05 108.56 41.67 213.46 109.70
2010-01-06 108.64 41.89 210.07 111.51
2010-01-07 109.10 42.72 209.68 110.82
2010-01-08 109.46 42.62 211.07 111.37
... ... ... ... ...
2011-12-23 125.19 32.84 401.61 156.31
2011-12-27 125.29 32.31 404.79 154.91
2011-12-28 123.64 31.94 400.92 151.03
2011-12-29 124.92 32.69 403.39 150.34
2011-12-30 124.31 32.53 403.27 151.99
[504 rows x 4 columns]
>>>data = {}
>>>for sym in sym_df.columns:
>>> sym_df = sym_df.rename(columns={sym: 'Adj_Close_Price'})
>>> data[sym] = sym_df['Adj_Close_Price']
>>> sym_df = sym_df.drop(['Adj_Close_Price'], axis=1)
>>>df = pd.concat(data.values(), keys=data.keys())
>>>df = df.reset_index()
>>>df = df.rename(columns={'level_0': 'Symbol', 'level_1': "Date"})
>>>df.set_index(['Symbol', 'Date'], inplace=True)
>>>df.sort_index(inplace=True)
>>>df = df.fillna(method='ffill')
>>>df = df.fillna(method='bfill')
>>>print(df)
Adj_Close_Price
Symbol Date
AAPL 2010-01-04 213.10
2010-01-05 213.46
2010-01-06 210.07
2010-01-07 209.68
2010-01-08 211.07
... ...
SPY 2011-12-23 125.19
2011-12-27 125.29
2011-12-28 123.64
2011-12-29 124.92
2011-12-30 124.31
[2016 rows x 1 columns]
【问题讨论】:
标签: python pandas dataframe multi-index