2016-08-12 85 views
1

其實在這個問題上有很多部分。我通過查看其他堆棧溢出問題的答案來解決了一些問題。但是,仍然有一個小問題沒有解決。輸出csv文件傾向於按字母順序或其他順序排序,這不是我想要的。如何連接兩個csv文件並保持python中列的原始順序?

作爲一個例子,我將垂直連接兩個csv文件。這兩個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") 

然後將它們連接起來,並通過

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

輸出CSV看起來像

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

有什麼辦法來解決這個問題寫爲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)) 

它也不起作用,因爲set會混亂列表。

+0

你需要爲此使用熊貓嗎? –

+0

您可以從第一個文件讀取列名,將其轉換爲字符串列表並將其放入'.to_csv'參數'cols'中。 – meetaig

+0

是的。我使用熊貓,因爲我需要自動匹配兩個文件的列名稱。 – Chenlu

回答

0

你幾乎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'],它不會簡單地將b中的額外列放在c.csv的末尾? – Chenlu

相關問題