2016-08-12 9 views
1

実際、この質問には多くの部分があります。私は他のスタックオーバーフローの質問の答えを見ていくつかの部分を解決しました。しかし、まだ解決されていない小さな問題が1つあります。出力されたcsvファイルは、アルファベット順に並べ替える傾向があります。2つのcsvファイルを連結してPythonの列の元の順序を保持する方法は?

例として、2つのcsvファイルを垂直方向に連結します。 2つのcsvは次のようになります。

a.csv 
    B, A, C, E 
    1, 1, 1, 1 

    b.csv 
    B, A, D, C 
    2, 2, 2, 2 

私が取得したいのですが、結果は私がパンダのデータフレームにそれらを読んで、

c.csv 
    B, A, D, C, E 
    1, 1, , 1, 1 
    2, 2, 2, 2, 

ファーストです。

a = pd.read_csv("a.csv") 
    b = pd.read_csv("b.csv") 

そして、出力CSVが

c.csv 
    A, C, D, B, E 
    1, 1, , 1, 1 
    2, 2, 2, , 2 

のように見えるそれらを連結し、

c = pd.concat([a, b], join='outer') 
    c.to_csv("c.csv", index=False) 

によりCSVへの書き込みの問題を解決する方法はありますか?私はかつて、私は手動で列名の順序を書き留めすることはできません答えPreserving column order in Python Pandas DataFrame

df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python') 

しかし、私のcsvファイル内の列の何百もあるから、コードのようなものを考えました。また、ファイルのグループごとに列名が異なります。セットが障害リストをするので、私は、それはまた、動作しません

set(a.columns.values).union(list(b.columns.values)) 

を試してみました。

+0

これにはパンダを使用する必要がありますか? –

+0

最初のファイルから列名を読み込み、文字列リストに変換して '.to_csv'引数' cols'に入れることができます。 – meetaig

+0

はい。私は2つのファイルの列名を自動的に一致させる必要があるので、私はパンダを使用しました。 – Chenlu

答えて

0

あなたはほぼ1行でa.columns

col_names = a.columns.tolist() # list of column names 
sorted_cols = sorted(col_names) 

df.to_csv("dfTest.txt","\t",header=True,cols=sorted_cols, engine='python') 

でそれを持っている:

df.to_csv("dfTest.txt","\t", 
      header=True, 
      cols=sorted(a.columns.tolist()), 
      engine='python') 
1

あなたがc.to_csv(...)に供給できる出力順序、例えばビルドアップ:

from collections import OrderedDict 
out_order = OrderedDict.fromkeys(a.columns) 
out_order.update(OrderedDict.fromkeys(b.columns)) 
out_order = list(out_order) 
# ['B', 'A', 'C', 'E', 'D'] 

c.to_csv("c.csv", index=False, columns=out_order) 
+0

ありがとうございます。これはほとんど私が欲しいものです。とにかく最後のout_order ['B'、 'A'、 'D'、 'C​​'、 'E']を作成します。これはc.csvの最後に余分な列をbから入れないだけですか? – Chenlu

関連する問題