保留Python Pandas DataFrame中的列顺序

Her*_*nan 36 python pandas

有没有办法在读取和使用Python Pandas写入时保留csv文件中列的顺序?例如,在此代码中

import pandas as pd

data = pd.read_csv(filename)
data.to_csv(filename)
Run Code Online (Sandbox Code Playgroud)

输出文件可能不同,因为不保留列.

Cnr*_*nrL 31

当前版本的Pandas('0.11.0')似乎存在一个错误,这意味着Matti John的回答不起作用.如果指定用于写入文件的列,则它们按字母顺序编写,但只是根据cols中的列表重新标记.例如,这段代码:

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"])
Run Code Online (Sandbox Code Playgroud)

导致此(不正确)输出:

    b   a   c
0   1   5   9
1   2   6   10
2   3   7   11
3   4   8   12
Run Code Online (Sandbox Code Playgroud)

您可以通过执行以下内容来检查已安装的大熊猫版本:

pandas.version.version
Run Code Online (Sandbox Code Playgroud)

to_csv的文档在这里

实际上,这似乎是一个已知的错误,将在即将发布的版本中修复(0.11.1):

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

更新:仍然没有新的熊猫版本,但这里描述了一个解决方法,不需要使用不同版本的熊猫:

github.com/pydata/pandas/issues/3454

因此,将上面代码块中的最后一行更改为以下内容将正常工作:

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

更新似乎参数"cols"已重命名为"columns",并且在最近版本的pandas中不推荐使用参数"engine"(不再可用).此外,此错误已在版本0.19.0中修复.

  • 好像它被重命名为`columns`.将`cols`更改为`columns`现在对我有用. (11认同)
  • 使用最近的 Pandas (0.19.2) 尝试此解决方案会给出:`TypeError: to_csv() got an unexpected keyword argument 'cols'` API 是否更改了? (2认同)

Mat*_*ohn 20

通常应该在读取然后编写类似的csv文件时保留列顺序,但如果由于某种原因它们不是您想要的顺序,则可以使用columns关键字参数to_csv.

例如,如果您的csv包含列a,b,c,d:

data = pd.read_csv(filename)
data.to_csv(filename, columns=['a', 'b', 'c', 'd'])
Run Code Online (Sandbox Code Playgroud)


小智 6

另一种解决方法是这样做:

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)
Run Code Online (Sandbox Code Playgroud)