通过迭代将列添加到MultiIndex数据帧

时间:2017-04-24 19:17:56

标签: python iteration multi-index bloomberg

我有一个MultiIndex问题。我使用第三方软件包,以MultiIndex格式提供股票价格和市盈率。我试图做的是为每个股票代码迭代添加两个新列,计算PE比率的平均值和标准值。

可以使用以下代码复制粗略数据结构:

arrays = [['GOOGL US Equity','GOOGL US Equity','IBM US Equity','IBM US Equity'],['LAST_PRICE','BEST_PE_RATIO']*2]
columns = pd.MultiIndex.from_arrays(arrays, names=['ticker','field'])

df = pd.DataFrame(np.random.randn(4,4), 
                  columns=columns, 
                  index=pd.date_range('20160103',periods=4))

输出类似于以下内容:

df

我已尝试使用下面的代码临时执行此操作,但仍然会收到一些关键词和“切片”。错误...

df['GOOGL US Equity']['1 STD DEV'] = df['GOOGL US Equity']['BEST_PE_RATIO'].std()

是否有更多的pythonic解决方案可以创建新的所需列并通过代码进行迭代?

1 个答案:

答案 0 :(得分:0)

通过链式索引将值设置为dataframe时,有时会失败并且结果很难预测。见:Returning a view versus a copy in Pandas。我认为df[('GOOGL US Equity','1 STD DEV')] = df['GOOGL US Equity']['BEST_PE_RATIO'].std()是解决方案。

如果你有很多代码,那么就这样做:

for ticker in df.columns.levels[0]:
    df[(ticker, '1 STD DEV')] = df[ticker]['BEST_PE_RATIO'].std()

此外,如果您想使用列,请使用df.sort_index(axis=1)