2016-11-04 24 views
2

我有一个多索引数据帧,其中最内层的索引可以是不等长的,我希望能够添加具有重复值的另一列,但由于行数不相等,所以我不能这么有:在多索引数据帧上应用reptitive序列

df['marker'] = np.repeat([0,1,2], len(df), axis = 0) 
ValueError: Length of values does not match length of index 

这里是我的数据框样本:

       close 
date ticker  expiry_dt 
2016-07-27 BHEL 2016-07-28 147 
        2016-08-25 147 
        2016-09-29 150 
2016-07-28 BHEL 2016-07-28 149 
        2016-08-25 147 
        2016-09-29 149 
2016-07-29 BHEL 2016-08-25 149 
        2016-09-29 149 

,你可以看到,最内层指数( 'expirty_dt')是不等长的。我期望的输出是:

enter image description here

我也许可以通过一个循环做到这一点,但我有一个庞大的数据库和循环将在每天的基础上这样做效率低下。在此先感谢

回答

1

你想

df.groupby(['date', 'ticker']).cumcount() 
+0

高超!谢谢。 –

0

您的np.repeat表达式会生成一个整数为3*len(df)的数组。

In [176]: np.repeat([0,1,2],3) 
Out[176]: array([0, 0, 0, 1, 1, 1, 2, 2, 2]) 
In [177]: _.shape 
Out[177]: (9,) 

有一个不同的中继

In [178]: np.tile([0,1,2],3) 
Out[178]: array([0, 1, 2, 0, 1, 2, 0, 1, 2]) 

但仍然总数方面是否正确的问题。

+0

是的,我想np.tile是我想要的。但是,如何解决行数不相等的问题? –

+0

您想要的是唯一日期的数量,即第一列,而不是“close”值的数量。也许'len(df)/ 3'将起作用。 (我是一个numpy用户,不是熊猫,所以我在这里猜测)。 – hpaulj

+0

我在想,如果这可以用groupby在外部索引上解决,而不是在它上面应用一个序列。像这样: df ['marker'] = df.groupby(level = 0,group_keys = False).apply(lambda x:np.arange(0,3)) 这仍然不起作用,但是想知道思考是正确的! –