我正在构建一个应该有两个列级别的数据框:上一级将是任意数量的测量值,然后第二级将具有“平均值”。和' 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(第一种方法)或在构建数据帧时构建它,然后填写单个单元格。
编辑:根据要求,这是一个示例数据框
我的程序化问题是我将有一个任意数量的顶级列(CHG_NET_1D,VOLUME,OPEN_INT,D_OI等等)我需要给每个列的子列提供"平均"和" sd"。
问题: (1)我无法弄清楚如何逐步向数据帧添加更多列/子列 (2)如果我想一次组装整个数据帧(不是逐步添加列),那么我不知道创建任意数量的多级列的好方法。我最终做了像上面的hackColumns示例那样的事情。
答案 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_1
和outer_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