之前我一直使用 pandas.Panel
来存储多个数据帧,日期列表中的每个日期一个数据帧。
自从面板被弃用以来,我正在尝试转换为使用多索引数据框。
例如,我有以下数据:
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
对象的最简单方法是什么(即:日期对日期)?
最佳答案
使用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
在多重索引上设置 bool 索引
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
关于python - 将多索引数据框中的所有匹配元素设置为系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088452/