web-dev-qa-db-fra.com

Ordre des colonnes dans pandas.concat

Je fais comme ci-dessous:

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
data


   a    b
0   2   1
1   2   1
2   2   1
0   2   1
1   2   1
2   2   1

L'ordre des colonnes de données est dans l'ordre alphabétique. Pourquoi est-ce le cas? Et comment conserver la commande originale?

15
Edward

Vous créez des DataFrames à partir de dictionnaires. Les dictionnaires sont non ordonnés, ce qui signifie que les clés n'ont pas d'ordre spécifique. Alors

d1 = {'key_a': 'val_a', 'key_b': 'val_b'}

et 

d2 = {'key_b': 'val_b', 'key_a': 'val_a'}

sont identiques.

En plus de cela, je suppose que les pandas trient les clés du dictionnaire par ordre décroissant (malheureusement, je n'ai trouvé aucune indication dans la documentation pour prouver cette hypothèse), ce qui a provoqué le comportement que vous avez rencontré.

La motivation de base serait donc de recourir/réorganiser les colonnes de votre DataFrame. Vous pouvez faire ceci comme suit :

import pandas as pd

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)

print(data)

cols = ['b' , 'a']
data = data[cols]

print(data)
10
albert

Vous pouvez créer les DataFrames d'origine avec OrderedDicts

from collections import OrderedDict

odict = OrderedDict()
odict['b'] = [1, 1, 1]
odict['a'] = [2, 2, 2]
data1 = pd.DataFrame(odict)
data2 = pd.DataFrame(odict)
frames = [data1, data2]
data = pd.concat(frames)
data


    b    a
0   1    2
1   1    2
2   1    2
0   1    2
1   1    2
2   1    2
2
mohrtw
def concat_ordered_columns(frames):
    columns_ordered = []
    for frame in frames:
        columns_ordered.extend(x for x in frame.columns if x not in columns_ordered)
    final_df = pd.concat(frames)    
    return final_df[columns_ordered]       

# Usage
dfs = [df_a,df_b,df_c]
full_df = concat_ordered_columns(dfs)

Cela devrait marcher.

2
Philip Zelitchenko

vous pouvez aussi spécifier l'ordre comme ceci: 

import pandas as pd

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
listdf = [data1, data2]
data = pd.concat(listdf)
sequence = ['b','a']
data = data.reindex(columns=sequence)
1
Oumab10