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

Adding columns to MultiIndex dataframe via iteration

我有一个多索引问题。我使用第 3 方包,以 MultiIndex 格式向我提供股票价格和市盈率。我想要做的是为每个股票代码迭代添加两个新列,计算市盈率的平均值和标准偏差。

粗略的数据结构可以用这段代码复制:

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))

输出类似于以下内容:

我尝试使用下面的代码临时执行此操作,但不断收到大量的键盘错误和 'slice' 错误...

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

是否有更 pythonic 的解决方案来创建新的所需列并遍历代码?

通过链式索引为数据帧设置值时,有时会失败并且结果难以预测。看这个: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)