2017-09-27 1 views
1

J'ai une trame de données de pandas géants en python provenant d'un pd.concat avec une multiindice récurrente:remis à zéro un multiindice récurrent dans Pandas

 customer_id 
0 0 46841769 
    1 4683936 
1 0 8880872 
    1 8880812 
0 0 8880873 
    1 1000521 
1 0 1135488 
    1 5388773 

Non, je réinitialiser seulement le premier indice de la multiindice, de sorte que Je reçois un nombre récurrent sur l'index. Quelque chose comme ceci:

 customer_id 
0 0 46841769 
    1 4683936 
1 0 8880872 
    1 8880812 
2 0 8880873 
    1 1000521 
3 0 1135488 
    1 5388773 

En général, j'ai environ 5 millions d'enregistrements et pas la plus grande machine. Je suis donc à la recherche d'une solution efficace pour la mémoire.

ignore_index = La valeur True dans pd.concat ne fonctionne pas, car je perds alors le multi-index.

Un grand merci

+0

Quel est votre code 'concat'? – jezrael

Répondre

1

Vous pouvez convertir premier niveau par get_level_valuesto_series, puis comparer avec shift valeurs ées et ajouter cumsum pour le nombre et la dernière utilisation MultiIndex.from_arrays:

a = df.index.get_level_values(0).to_series() 
a = a.ne(a.shift()).cumsum() - 1 

mux = pd.MultiIndex.from_arrays([a, df.index.get_level_values(1)], names=df.index.names) 

df.index = mux 

Ou:

df = df.set_index(mux) 

print (df) 
    customer_id 
0 0  46841769 
    1  4683936 
1 0  8880872 
    1  8880812 
2 0  8880873 
    1  1000521 
3 0  1135488 
    1  5388773 
+0

Merci pour la réponse. Si je fais cela, je perdrai mon multi-index et n'obtiendra qu'un seul index pour les données. Cependant j'ai besoin de cette construction 0,1. –

+0

Cool, merci travaux. Merci beaucoup pour la réponse rapide. Fait ma journée. –

+0

Glad peut vous aider! Si ma réponse a été utile, ne pas oublier [accepter] (http://meta.stackexchange.com/a/5235/295067) il - cliquez sur la coche («✓») à côté de la réponse pour le faire passer de grisé à remplir. Merci. – jezrael