50 votes

Comment créer un DataFrame tout en préservant l'ordre des colonnes?

Comment puis-je créer un DataFrame à partir de plusieurs numpy tableaux, Pandas de la Série, ou Pandas DataFrame du tout en préservant l'ordre des colonnes?

Par exemple, j'ai ces deux - numpy tableaux et je tiens à les mélanger entre eux un Pandas DataFrame.

foo = np.array( [ 1, 2, 3 ] )
bar = np.array( [ 4, 5, 6 ] )

Si je fais cela, l' bar colonne d'abord parce qu' dict ne pas maintenir l'ordre.

pd.DataFrame( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) } )

    bar foo
0   4   1
1   5   2
2   6   3

Je peux le faire, mais c'est pénible quand j'ai besoin de combiner un grand nombre de variables.

pd.DataFrame( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) }, columns = [ 'foo', 'bar' ] )

EDIT: Est-il un moyen de spécifier les variables à ajouter et d'organiser l'ordre des colonnes en une seule opération? C'est, je n'ai pas l'esprit à l'aide de plusieurs lignes pour compléter l'ensemble de l'opération, mais je préfère ne pas avoir à préciser les variables qui doivent être joints à plusieurs reprises (car je vais changer le code beaucoup et c'est à peu enclins à faire des erreurs).

EDIT2: Un point de plus. Si je veux en ajouter ou en supprimer des variables à être rejoint, je veux seulement ajouter/supprimer en un seul endroit.

35voto

Eddo Hintoso Points 372

Solution originale: Utilisation Incorrecte de l' collections.OrderedDict

Dans ma solution originale, j'ai proposé d'utiliser OrderedDict de la collections package python standard library.

>>> import numpy as np
>>> import pandas as pd
>>> from collections import OrderedDict
>>>
>>> foo = np.array( [ 1, 2, 3 ] )
>>> bar = np.array( [ 4, 5, 6 ] )
>>>
>>> pd.DataFrame( OrderedDict( { 'foo': pd.Series(foo), 'bar': pd.Series(bar) } ) )

   foo  bar
0    1    4
1    2    5
2    3    6

Solution: Passage Clé-Valeur du Tuple Paires pour la Conservation de l'Ordre

Toutefois, comme indiqué, si un normal dictionnaire est passé de OrderedDict, l'ordre peut-être pas encore préservée puisque l'ordre est aléatoire lors de la construction du dictionnaire. Cependant, un travail autour de est de convertir une liste de clé-valeur n-uplet de paires en un OrderedDict, comme l'a suggéré à partir de cette SORTE de post:

>>> import numpy as np
>>> import pandas as pd
>>> from collections import OrderedDict
>>>
>>> a = np.array( [ 1, 2, 3 ] )
>>> b = np.array( [ 4, 5, 6 ] )
>>> c = np.array( [ 7, 8, 9 ] )
>>>
>>> pd.DataFrame( OrderedDict( { 'a': pd.Series(a), 'b': pd.Series(b), 'c': pd.Series(c) } ) )

   a  c  b
0  1  7  4
1  2  8  5
2  3  9  6

>>> pd.DataFrame( OrderedDict( (('a', pd.Series(a)), ('b', pd.Series(b)), ('c', pd.Series(c))) ) )

   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

32voto

blokeley Points 1543

Utilisez le mot clé columns lors de la création du DataFrame :

 pd.DataFrame({'foo': foo, 'bar': bar}, columns=['foo', 'bar'])
 

Notez également que vous n'avez pas besoin de créer la série.

15voto

Vidhya G Points 1274

Afin de préserver l'ordre des colonnes passer dans vos tableaux numpy comme une liste de tuples DataFrame.from_items:

>>> df = pd.DataFrame.from_items([('foo', foo), ('bar', bar)])

   foo  bar
0    1    4
1    2    5
2    3    6

Mise à jour

De pandas 0.23 from_items est obsolète et sera supprimé. Afin de passer l' numpy tableaux à l'aide d' from_dict. Pour utiliser from_dict vous avez besoin de transmettre les éléments d'un dictionnaire:

>>> from collections import OrderedDict as OrderedDict
>>> df = pd.DataFrame.from_dict(OrderedDict(zip(['foo', 'bar'], [foo, bar])))

À partir de python de 3,7 vous pouvez compter sur la commande d'insertion d'être conservés (voir https://mail.python.org/pipermail/python-dev/2017-December/151283.html) donc:

>>> df = pd.DataFrame.from_dict(dict(zip(['foo', 'bar'], [foo, bar])))

ou tout simplement:

>>> df = pd.DataFrame(dict(zip(['foo', 'bar'], [foo, bar])))

9voto

tfv Points 2982

Après avoir créé votre trame de données, vous pouvez simplement réorganiser les colonnes comme vous le souhaitez en utilisant

 df= df[['foo','bar']]
 

1voto

Eric Points 51

Je ne pouvais pas commenter pour demander, mais comment allez-vous spécifier l'ordre des colonnes en premier lieu (puisque vous ne pouvez pas avec un dictionnaire normal)?

Si vous souhaitez conserver un dictionnaire ordonné:

 from collections import OrderedDict
import numpy as np
import pandas as pd

data = OrderedDict()
data['foo'] = np.array([1, 2, 3])
data['bar'] = np.array([4, 5, 6])

df = pd.DataFrame(data)
 

Si vous n'avez qu'une liste de clés à commander:

 data = {key: value for key, value in data.iteritems()}
df = pd.concat(data.values(), keys=['foo', 'bar'], axis=1)
 

La réponse de @ tfv est probablement la manière la plus concise de faire ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X