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