web-dev-qa-db-ja.com

pandas.concatの列の順序

私は以下のようにします:

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

データ列の順序はアルファベット順です。なぜそうですか?元の順序を維持する方法は?

20
Edward

辞書からDataFrameを作成しています。辞書は順序付けされていないため、キーには特定の順序はありません。そう

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

そして

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

同じだ。

それに加えて、pandasはデフォルトで辞書のキーを降順でソートします(残念ながら、その仮定を証明するためのドキュメントにはヒントが見つかりませんでした)。

したがって、基本的な動機は、DataFrame内の列を並べ替える/並べ替えることです。これを行うことができます 次のように

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

OrderedDictsを使用して元のDataFramesを作成できます

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)

これは動作するはずです。

2

バージョン0.23.0から、concat()メソッドが返されたDataFrameをソートするのを防ぐことができます。例えば:

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)

pandasの将来のバージョンは、デフォルトでソートしないように変更されます。

1
Michael H.

次のように順序を指定することもできます。

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

最も簡単な方法は、最初に列を同じ順序にしてから連結します:

df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)
0
Emre Tatbak