2013-03-27 112 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