2013-07-23 15 views
9

私はインデックスで作業しているデータは複合です。つまり、アイテム名とタイムスタンプの両方を持っています。 [email protected]|2013-05-07 05:52:51 +0200PandasのインデックスをMultiIndex(階層インデックス)に変換

同じ電子メールがグループ化されるように階層索引を作成したいので、DataFrameインデックスをMultiIndexに変換する必要があります(たとえば、上記のエントリの場合は - ([email protected], 2013-05-07 05:52:51 +0200))。

これを行う最も便利な方法は何ですか?

答えて

9

我々は階層索引を作成することができますDATAFRAME

import pandas as pd 
df = pd.read_csv("input.csv", index_col=0) # or from another source 

タプルに各インデックスをマッピングする機能(以下、それはこの質問から、たとえばある)

def process_index(k): 
    return tuple(k.split("|")) 

を持っていたら、

df.index = pd.MultiIndex.from_tuples([process_index(k) for k,v in df.iterrows()]) 

代替の方法は、2つの列を作成してから次のように設定することです。インデックス(元のインデックスが削除されます):

df['e-mail'] = [x.split("|")[0] for x in df.index] 
df['date'] = [x.split("|")[1] for x in df.index] 
df = df.set_index(['e-mail', 'date']) 

またはさらに短い

+0

これはとても役に立ちました。しかし、私が見る限り、set_index()を呼び出すと、デフォルトはinplace = Falseなので、inplace = Trueを使用するか、dfをそれ自身に戻す必要があります。 – Moot

+0

@Mootありがとうございました。タイプミスかバック(4年前)のどちらかは、デフォルトでは「インプレース」でした。 –

+0

素晴らしい!しかし、2つの場所がありました - コードの最初のスニペットを確認してください... – Moot

2
df['e-mail'], df['date'] = zip(*map(process_index, df.index)) 
df = df.set_index(['e-mail', 'date']) 

私の好みは、最初の列としてこれを読み込むことであろう(すなわち、おそらくこれはクリーナー行うことができます(マルチインデックスにこれを送り、その後

csv = '\n'.join(['[email protected]|2013-05-07 05:52:51 +0200, 42'] * 3) 
df = pd.read_csv(StringIO(csv), header=None) 

In [13]: df[0].str.split('|') 
Out[13]: 
0 [[email protected], 2013-05-07 05:52:51 +0200] 
1 [[email protected], 2013-05-07 05:52:51 +0200] 
2 [[email protected], 2013-05-07 05:52:51 +0200] 
Name: 0, dtype: object 

と):ないインデックスなど)、あなたはstrの分割方法を使用することができますか?

m = pd.MultiIndex.from_arrays(zip(*df[0].str.split('|'))) 

は0番目の列を削除します。そして新しいマルチインデックスにインデックスを設定します。pandas>=0.16.0では、我々はインデックスに.strアクセサを使用することができます

del df[0] 
df.index = m 

In [17]: df 
Out[17]: 
              1 
[email protected] 2013-05-07 05:52:51 +0200 42 
       2013-05-07 05:52:51 +0200 42 
       2013-05-07 05:52:51 +0200 42 
3

。これは、次のを可能にします:

df.index = pd.MultiIndex.from_tuples(df.index.str.split('|').tolist()) 

(注:私は、より直観的に試してみました:pd.MultiIndex.from_arrays(df.index.str.split('|'))が、私にエラーを与える何らかの理由で。)

関連する問題