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?
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)
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
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.
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)