Ich mache wie folgt:
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
Die Reihenfolge der Datenspalten erfolgt in alphabetischer Reihenfolge. Warum ist es so? Und wie wird die ursprüngliche Bestellung beibehalten?
Sie erstellen DataFrames aus Wörterbüchern. Wörterbücher sind ungeordnet, dh die Schlüssel haben keine bestimmte Reihenfolge. So
d1 = {'key_a': 'val_a', 'key_b': 'val_b'}
und
d2 = {'key_b': 'val_b', 'key_a': 'val_a'}
sind gleich.
Darüber hinaus gehe ich davon aus, dass Pandas die Schlüssel des Wörterbuchs standardmäßig absteigend sortiert (leider habe ich in den Dokumenten keinen Hinweis gefunden, um diese Annahme zu beweisen), was zu dem Verhalten führt, das Sie angetroffen haben.
Die grundlegende Motivation wäre also, die Spalten in Ihrem DataFrame neu zu sortieren. Sie können dies wie folgt :
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)
Sie können die ursprünglichen DataFrames mit OrderedDicts erstellen
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)
Das sollte funktionieren.
Ab Version 0.23.0 können Sie verhindern, dass die concat () -Methode den zurückgegebenen DataFrame sortiert. Zum Beispiel:
df1 = pd.DataFrame({ 'a' : [1, 1, 1], 'b' : [2, 2, 2]})
df2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
df = pd.concat([df1, df2], sort=False)
In einer zukünftigen Version von pandas wird standardmäßig nicht sortiert.
sie können die Reihenfolge auch so angeben:
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)
Am einfachsten ist es, zuerst die Spalten in der gleichen Reihenfolge anzuordnen und dann zuzuordnen:
df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)