15

私が使用しているデータでは、インデックスは複合的です。つまり、アイテム名とタイムスタンプの両方がありますname@domain.com|2013-05-07 05:52:51 +0200

同じ電子メールがグループ化されるように、階層的なインデックス作成を行いたいので、DataFrame インデックスを MultiIndex に変換する必要があります (たとえば、上記のエントリについては - (name@domain.com, 2013-05-07 05:52:51 +0200))。

そうするための最も便利な方法は何ですか?

4

3 に答える 3

23

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()])

もう 1 つの方法は、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'])

またはさらに短い

df['e-mail'], df['date'] = zip(*map(process_index, df.index))
df = df.set_index(['e-mail', 'date'])
于 2013-07-23T19:16:08.233 に答える
4

私の好みは、最初にこれを列として(つまり、インデックスとしてではなく)読み取ることです。その後、str split メソッドを使用できます。

csv = '\n'.join(['name@domain.com|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    [name@domain.com, 2013-05-07 05:52:51 +0200]
1    [name@domain.com, 2013-05-07 05:52:51 +0200]
2    [name@domain.com, 2013-05-07 05:52:51 +0200]
Name: 0, dtype: object

そして、これを MultiIndex にフィードします (おそらく、これはよりクリーンに実行できますか?):

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

0 番目の列を削除し、インデックスを新しい MultiIndex に設定します。

del df[0]
df.index = m

In [17]: df
Out[17]:
                                            1
name@domain.com 2013-05-07 05:52:51 +0200  42
                2013-05-07 05:52:51 +0200  42
                2013-05-07 05:52:51 +0200  42
于 2013-07-23T20:28:47.237 に答える