web-dev-qa-db-fra.com

Création d'un MultiIndex vide

Je voudrais créer un videDataFrame avec un MultiIndex avant de lui affecter des lignes. J'ai déjà constaté que les DataFrames vides n'aiment pas être attribués à la volée MultiIndexes, donc je configure le MultiIndex names lors de la création. Cependant, je ne veux pas assigner niveaux, car cela sera fait plus tard. C'est le meilleur code que j'ai obtenu jusqu'à présent:

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

Ce qui me donne

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

et

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

Out[3]:
one two three
NaN NaN NaN

Eh bien, je n'ai aucune utilité pour ces NaN. Je peux facilement les déposer plus tard, mais c'est évidemment une solution hackish. Quelqu'un en a un meilleur?

27
dmvianna

La solution est de laisser de côté les étiquettes. Cela fonctionne bien pour moi:

>>> 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

J'espère que cela pourra aider!

33
RoG

Une autre solution peut-être un peu plus simple consiste à utiliser la fonction 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

En utilisant pd.MultiIndex.from_arrays permet une solution un peu plus concise lors de la définition explicite de l'index:

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