创建多索引列DataFrame(扩展说明)

时间:2015-10-10 15:52:52

标签: python pandas

我正在构建一个应该有两个列级别的数据框:上一级将是任意数量的测量值,然后第二级将具有“平均值”。和' sd'每个测量的子列。

我希望通过逐个添加列集(测量+平均和sd子列)来组装数据框,但我无法弄清楚如何在pandas中逐步添加新的多级列。 我该怎么做?

作为替代方案,我一次组装dataFrame,然后使用dataframe.ix填充值。

但是我执行此组合的代码一次又一次是可怕的,因为在给定的函数运行中我有任意数量的测量值(上限)和statistics_vales(下限)。这是一个可怕的黑客版本,在列上有4个上层和2个下层。我怎么能取代这个恶心的代码?

hackColumnsUpperAttributes=['CHG_NET_1D','CHG_NET_1D','VOLUME','VOLUME','OPEN_INT','OPEN_INT','d_OI','d_OI']
hackColumnsLowerStats=["avg","sd","avg","sd","avg","sd","avg","sd"]

stats=pd.DataFrame(index=securities, columns = [hackColumnsUpperAttributes, hackColumnsLowerStats])

还想知道什么是更好的做法 - 构建数据帧incrementall(第一种方法)或在构建数据帧时构建它,然后填写单个单元格。

编辑:根据要求,这是一个示例数据框

Example data frame as requested

我的程序化问题是我将有一个任意数量的顶级列(CHG_NET_1D,VOLUME,OPEN_INT,D_OI等等)我需要给每个列的子列提供"平均"和" sd"。

问题: (1)我无法弄清楚如何逐步向数据帧添加更多列/子列 (2)如果我想一次组装整个数据帧(不是逐步添加列),那么我不知道创建任意数量的多级列的好方法。我最终做了像上面的hackColumns示例那样的事情。

1 个答案:

答案 0 :(得分:0)

如果您的行索引是一致的,您可以按pd.concat逐步添加。

就我理解您的问题而言,这是一种方法 - 取决于您的生成过程是什么,它可能有效也可能无效。

import pandas as pd
import numpy as np

outer_1 =['open','close','vol',]
outer_2 =['high','low']
inner = ['sd','mean']
tickers=['AAPL','MSFT','NTES','GOOG']

在这里,我们将outer_1outer_2定义为已知的外层,假设它们是已知的(如果是任意的话)。对于这些,我们需要inner中的统计数据。 (填写实际的计算逻辑)。

measure1=pd.DataFrame(np.random.randn(4,6),index=tickers,columns=pd.MultiIndex.from_product([outer_1,inner], names=['grp', 'detail']))

然后是第一帧

measure1.head()

grp         open               close                 vol          
detail        sd      mean        sd      mean        sd      mean
AAPL    1.809306 -0.218046 -0.847634 -0.652089 -1.089633 -0.784762
MSFT   -0.370508 -1.405567  0.015618  0.902277 -0.907756  1.519284
NTES    0.510792  1.030581 -0.657835  0.854525 -1.091934  0.890248
GOOG    0.171839  0.553251 -1.175595 -0.895070  0.597228 -0.948348

并且,让我们假设你想用另外数量的摘要统计数据扩展这个框架(对于相同的行索引,但是不同的外部列索引):

measure2=pd.DataFrame(np.random.randn(4,4),index=tickers,columns=pd.MultiIndex.from_product([outer_2,inner], names=['grp', 'detail']))
measure2.head()


grp         high                 low          
detail        sd      mean        sd      mean
AAPL    0.679143 -0.302045 -0.329448  0.731871
MSFT    0.335058  0.316156  0.469268 -1.535572
NTES    0.756789  0.612469 -1.016683 -0.244080
GOOG   -0.039307 -0.134497  0.333860  1.431367

然后,您可以合并,合并行索引(axis=1)。

pd.concat([measure1,measure2],axis=1)

grp         open               close                 vol                high                 low          
detail        sd      mean        sd      mean        sd      mean        sd      mean        sd      mean
AAPL    1.809306 -0.218046 -0.847634 -0.652089 -1.089633 -0.784762  0.679143 -0.302045 -0.329448  0.731871
MSFT   -0.370508 -1.405567  0.015618  0.902277 -0.907756  1.519284  0.335058  0.316156  0.469268 -1.535572
NTES    0.510792  1.030581 -0.657835  0.854525 -1.091934  0.890248  0.756789  0.612469 -1.016683 -0.244080
GOOG    0.171839  0.553251 -1.175595 -0.895070  0.597228 -0.948348 -0.039307 -0.134497  0.333860  1.431367