web-dev-qa-db-ja.com

空のマルチインデックスを作成する

行を割り当てる前にemptyDataFrameMultiIndexで作成したいと思います。空のDataFramesがその場でMultiIndexesに割り当てられるのを好まないことがすでにわかっているので、作成中にMultiIndex namesを設定しています。ただし、levelsを割り当てたくありません。これは後で行うためです。これは私がこれまでに得た最高のコードです:

def empty_multiindex(names):
    """
    Creates empty MultiIndex from a list of level names.
    """
    return MultiIndex.from_tuples(tuples=[(None,) * len(names)], names=names)

それは私に与えます

In [2]:

empty_multiindex(['one','two', 'three'])

Out[2]:

MultiIndex(levels=[[], [], []],
           labels=[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]],
           names=[u'one', u'two', u'three'])

そして

In [3]:
DataFrame(index=empty_multiindex(['one','two', 'three']))

Out[3]:
one two three
NaN NaN NaN

まあ、私はこれらのNaNを使用していません。後で簡単に削除できますが、これは明らかにハックなソリューションです。誰かがより良いものを持っていますか?

27
dmvianna

解決策はラベルを省くことです。これは私にとってはうまくいきます:

>>> my_index = pd.MultiIndex(levels=[[],[],[]],
                             labels=[[],[],[]],
                             names=[u'one', u'two', u'three'])
>>> my_index
MultiIndex(levels=[[], [], []],
           labels=[[], [], []],
           names=[u'one', u'two', u'three'])
>>> my_columns = [u'alpha', u'beta']
>>> df = pd.DataFrame(index=my_index, columns=my_columns)
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('Apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
                    alpha beta
one   two    three            
Apple banana cherry   0.1  0.2

お役に立てば幸いです。

33
RoG

もう少し簡単な別の解決策は、関数set_indexを使用することです。

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['one', 'two', 'three', 'alpha', 'beta'])
>>> df = df.set_index(['one', 'two', 'three'])
>>> df
Empty DataFrame
Columns: [alpha, beta]
Index: []
>>> df.loc[('Apple','banana','cherry'),:] = [0.1, 0.2]
>>> df
                    alpha beta
one   two    three            
Apple banana cherry   0.1  0.2
19
Jean Paul

pd.MultiIndex.from_arraysを使用すると、インデックスを明示的に定義するときに、少し簡潔なソリューションが可能になります。

import pandas as pd
ind = pd.MultiIndex.from_arrays([[]] * 3, names=(u'one', u'two', u'three'))
df = pd.DataFrame(columns=['alpha', 'beta'], index=ind)
df.loc[('Apple','banana','cherry'), :] = [4, 3]

                     alpha  beta
one   two    three              
Apple banana cherry      4     3
2
mcsoini