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

标签 python pandas dataframe

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

返回数据帧如下:

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 对象的最简单方法是什么(即:日期对日期)?

最佳答案

使用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 在多重索引上设置 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/

相关文章:

python - 按数据帧中的行计算非零值的非重叠运行

python - 如何在 Python 的多索引数据框中导入多个 Excel 工作表?

python - 有没有一种有效的方法对标记的相似数据点进行聚类?

python - 为什么我会收到此布料放置错误?

Python曲线拟合与无限求和

python - 内容处置不起作用

python - Pandas 合并两个数据框,一个包含另一个数据框的列值

python - 如何将Python pandas数据保存到Excel文件中?

python - 带有 DatetimeIndex 的 Pandas set_Value [Python]

python - 将 pd 数据框填写到现有的 excel 表中(使用 openpyxl v2.3.2)