以前,我一直使用pandas.Panel
存储多个数据框,每个日期在日期列表中一个。
由于面板的弃用,我试图转换为使用multindex数据框。
例如,我有以下数据:
dates = pandas.date_range('20180101', periods=3)
stocks = ['AAPL', 'GOOG', 'MSFT', 'AMZN', 'FB']
在弃用之前,我可以创建一个面板,如下所示:
pnl = pandas.Panel(items=dates, major_axis=stocks, minor_axis=stocks, dtype=float)
我现在每个日期有1个数据框,例如,选择第一个:
pnl['2018-01-01']
按如下所示返回数据框:
但是,现在,根据贬损警告中的建议,我正在创建一个多索引数据框:
tuples = list(itertools.product(dates, stocks))
index = pandas.MultiIndex.from_tuples(tuples, names=['date', 'stock'])
df = pandas.DataFrame(index=index, columns=stocks, dtype=float)
现在生成的数据框如下所示:
到目前为止一切都很好...
填充数据框:
我有一个给定股票对的pandas.Series
数据,每个日期有一个条目。
例如:
data = pandas.Series([1.3, 7.4, 8.2], index=dates)
该系列如下:
2018-01-01 1.3
2018-01-02 7.4
2018-01-03 8.2
Freq: D, dtype: float64
例如,此数据用于股票对['GOOG','MSFT']
。
我想设置所有 ['GOOG','MSFT']
个条目。
在我的面板中,我可以使用以下简洁语法轻松完成此操作:
pnl.loc[:,'GOOG','MSFT'] = data
从多索引数据框中选择所有['GOOG','MSFT']
元素并将其设置为我的pandas.Series
对象(即日期为日期)的最简单方法是什么?
答案 0 :(得分:2)
使用pd.DataFrame.loc
和pd.IndexSlice
:
df.loc[pd.IndexSlice[data.index, 'GOOG'], 'MSFT'] = data.values
如果您有很多数据对,请将它们放在这样的字典中:
pairs = {('GOOG', 'MSFT'): data}
然后遍历各对,并使用loc
和pd.IndexSlice
设置值。
for k, v in pairs.items():
df.loc[pd.IndexSlice[v.index, k[0]], k[1]] = v.values
作为IndexSlice
的替代方法,您可以使用索引方法get_level_value
df.loc[ (df.index.get_level_values(1) == 'GOOG') &
(df.index.get_level_values(0).isin(data.index))
, 'MSFT'] = data.values
以上所有内容都会产生以下输出:
AAPL GOOG MSFT AMZN FB
date stock
2018-01-01 AAPL NaN NaN NaN NaN NaN
GOOG NaN NaN 1.3 NaN NaN
MSFT NaN NaN NaN NaN NaN
AMZN NaN NaN NaN NaN NaN
FB NaN NaN NaN NaN NaN
2018-01-02 AAPL NaN NaN NaN NaN NaN
GOOG NaN NaN 7.4 NaN NaN
MSFT NaN NaN NaN NaN NaN
AMZN NaN NaN NaN NaN NaN
FB NaN NaN NaN NaN NaN
2018-01-03 AAPL NaN NaN NaN NaN NaN
GOOG NaN NaN 8.2 NaN NaN
MSFT NaN NaN NaN NaN NaN
AMZN NaN NaN NaN NaN NaN
FB NaN NaN NaN NaN NaN