2017-06-08 2 views
1

J'ai passé des heures à parcourir des pages partout maintenant pour essayer de créer un multi-index à partir d'une base de données dans un pandas. C'est le dataframe je (affichage mockup feuille excel J'ai cela en pandas géants dataframe.):Créer un multi-index à partir d'une base de données existante

have

Et voici ce que je veux:

want

J'ai essayé

newmulti = currentDataFrame.set_index(['user_id','account_num']) 

Mais il renvoie une trame de données, pas un multi-index. De plus, je n'arrivais pas à trouver comment rendre 'user_id' niveau 0 et 'account_num' niveau 1. Je pense que cela doit être trivial mais j'ai lu tellement de posts, de tutoriels, etc. et je n'arrive toujours pas à le comprendre. En partie parce que je suis une personne très visuelle et que la plupart des messages ne le sont pas. S'il vous plaît aider!

+0

Pour des fins de traitement, les deux tables sont les mêmes. Mais à des fins d'affichage, je vous suggère de faire référence à: [stackoverflow.com/a/25127764/2306662](https://stackoverflow.com/a/25127764/2306662) – nikpod

+0

Mais je pensais avoir besoin de multi-index si, disons Je veux tracer les ventes totales (de tous compte) par rapport aux dates? – puifais

+0

@puifais pourquoi ne pouvez-vous pas tracer le deuxième dataframe que vous avez mis ensemble? –

Répondre

2

Vous pouvez simplement utiliser groupby dans ce cas, ce qui créera automatiquement le multi-index quand il additionne les ventes le long des colonnes demandées.

df.groupby(['user_id', 'account_num', 'dates']).sales.sum().to_frame() 

Vous devez également être en mesure de faire simplement ceci:

df.set_index(['user_id', 'account_num', 'dates']) 

Bien que vous voulez probablement éviter les doublons (par exemple deux ou plusieurs lignes avec identiques user_id, account_num et date valeurs mais des chiffres de ventes) en les additionnant, c'est pourquoi j'ai recommandé d'utiliser groupby.

Si vous avez besoin du multi-index, vous pouvez simplement accéder à viat new_df.indexnew_df est la nouvelle donnée créée à partir de l'une des deux opérations ci-dessus.

Et user_id qui sera de niveau 0 et account_num sera le niveau 1.

+0

Cela signifie donc grouper par user_id, account_num et dates et extraire les données de vente. Si les données de vente ont le même user_id, account_num et les mêmes dates, additionnez-les. Est-ce correct? – puifais

+1

Sort of ... Cela signifie que vous agrégez les données de vente via «sum». Si la colonne n'était pas numérique, vous ne seriez pas en mesure de l'additionner. Vous devriez utiliser quelque chose comme 'first',' last' ou 'unique' avec une fonction lambda. – Alexander

0

Le dataframe retourné par currentDataFrame.set_index(['user_id','account_num']) a elle indice est mis à ['user_id','account_num']

newmulti.index renverra l'objet multiindice.

+0

Hum ... Je ne comprends pas. Alors je fais 'newmulti = currentDataFrame.set_index (['user_id', 'account_num'])' et ensuite 'newmultiReal = newmulti.index'? Pourriez-vous clarifier s'il vous plaît? Je suis totalement nouveau chez les pandas. – puifais

+0

Quel est votre objectif final? Si vous voulez l'image originale avec un multi-index, vous l'avez déjà. –

1

Utilisez pd.MultiIndex.from_arrays

lvl0 = currentDataFrame.user_id.values 
lvl1 = currentDataFrame.account_num.values 

midx = pd.MultiIndex.from_arrays([lvl0, lvl1], names=['level 0', 'level 1'])