2016-11-04 8 views
2

マルチインデックスデータフレームを持っていますが、最も内側のインデックスの長さが違う場合があります。繰り返し値を持つ別のカラムを追加したいのですが、行数が等しくないため、multiindexデータフレームに刻々と変化するシーケンスを適用する

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'が動作します。 (私はパンダではなくて、私は愚かなユーザーだから、ここでは推測している)。 – hpaulj

+0

これはgroupbyで外側のインデックスを使って解決でき、それにシーケンスを適用することができるのではないかと考えています。 df ['marker'] = df.groupby(レベル= 0、group_keys = False).apply(lambda x:np.arange(0,3)) これはまだ動作しませんが、思考は正しいです! –

関連する問題