2013-03-27 108 views
19

有沒有辦法在讀取和使用Python Pandas寫入時保留csv文件中列的順序?例如,在此代碼中,在Python中保留列順序熊貓數據框

import pandas as pd 

data = pd.read_csv(filename) 
data.to_csv(filename) 

輸出文件可能不同,因爲列未保留。

+0

你能提供您的CSV的例子嗎? – waitingkuo 2013-03-27 08:09:36

回答

15

似乎存在一個錯誤熊貓( '0.11.0'),當前版本,其意味着馬蒂約翰的答案不起作用。如果您指定要寫入文件的列,則它們按字母順序編寫,但只需根據列中的列進行重新標記。例如,下面的代碼:

import pandas 
dfdict={} 
dfdict["a"]=[1,2,3,4] 
dfdict["b"]=[5,6,7,8] 
dfdict["c"]=[9,10,11,12] 
df=pandas.DataFrame(dfdict) 
df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"]) 

結果在這(不正確)的輸出:

b a c 
0 1 5 9 
1 2 6 10 
2 3 7 11 
3 4 8 12 

您可以檢查通過執行已安裝的大熊貓的版本:

pandas.version.version 

文檔to_csv是here

實際上,這似乎是一個已知的錯誤,將固定在即將推出的版本(0.11.1):

https://github.com/pydata/pandas/issues/3489

UPDATE:目前尚沒有得到大熊貓的一個新版本,但這裏所描述的解決方法,它不需要使用不同版本的熊貓:

github.com/pydata/pandas/issues/3454

因此改變上面下面的代碼塊中的最後一行將正常工作:

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

更新似乎參數「cols」已被重命名爲「列」,並且參數「引擎」在近期版本的熊貓中被棄用(不再可用)。此外,該錯誤在版本0.19.0中得到修復。

+0

嘗試用最近的熊貓(0.19.2)這個解決方案給出:TypeError:to_csv()得到了一個意想不到的關鍵字參數'cols'' API改變了嗎? – arielf 2017-03-22 23:50:30

+0

相信此選項已被棄用,因爲不再需要。 – CnrL 2017-03-23 06:03:29

+7

似乎它被重新命名爲'columns'。現在把'cols'改爲'columns'對我來說很有用。 – arielf 2017-03-24 05:25:22

11

當讀取並寫入一個csv文件時,一般應保留列順序,但如果由於某種原因它們不是您想要的順序,您可以使用to_csv中的columns關鍵字參數。

例如,如果你有A,B,C,d列的CSV:

data = pd.read_csv(filename) 
data.to_csv(filename, columns=['a', 'b', 'c', 'd']) 
4

另一個解決辦法是做到這一點:

import pandas as pd 
data = pd.read_csv(filename) 
data2 = df[['A','B','C']] #put 'A' 'B' 'C' in the desired order 
data2.to_csv(filename) 
+0

這是爲我工作的唯一解決方案。您可以通過一次性重新排序和創建CSV來減少一行代碼。 – Mtap1 2016-09-15 16:59:11