将多索引数据框中的所有匹配元素设置为一系列

时间:2018-06-28 17:21:55

标签: python pandas dataframe

以前,我一直使用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']

按如下所示返回数据框:

enter image description here

但是,现在,根据贬损警告中的建议,我正在创建一个多索引数据框:

tuples = list(itertools.product(dates, stocks))
index  = pandas.MultiIndex.from_tuples(tuples, names=['date', 'stock'])
df     = pandas.DataFrame(index=index, columns=stocks, dtype=float)

现在生成的数据框如下所示:

enter image description here

到目前为止一切都很好...

填充数据框:

我有一个给定股票对的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对象(即日期为日期)的最简单方法是什么?

1 个答案:

答案 0 :(得分:2)

使用pd.DataFrame.locpd.IndexSlice

df.loc[pd.IndexSlice[data.index, 'GOOG'], 'MSFT'] = data.values

如果您有很多数据对,请将它们放在这样的字典中:

pairs = {('GOOG', 'MSFT'): data}

然后遍历各对,并使用locpd.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