webentwicklung-frage-antwort-db.com.de

Spaltenreihenfolge in pandas.concat

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?

15
Edward

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)
10
albert

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

Das sollte funktionieren.

2

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.

1
Michael H.

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)
1
Oumab10

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)
0
Emre Tatbak