【问题标题】:Preserving column order in Python Pandas DataFrame在 Python Pandas DataFrame 中保留列顺序
【发布时间】:2013-03-17 05:30:17
【问题描述】:

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

import pandas as pd

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

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

【问题讨论】:

  • 您能提供一个您的 csv 示例吗?
  • 希望 OP 在此问题中添加了“当列名事先不知道时”限定符。此处发布的所有答案都假定所有列都是已知的,即使 OP 从未这么说过。

标签: python pandas


【解决方案1】:

当前版本的 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"])

导致这个(不正确的)输出:

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

你可以通过执行来查看你安装了哪个版本的pandas:

pandas.version.version

to_csv 的文档是here

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

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

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

github.com/pydata/pandas/issues/3454

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

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

更新似乎参数“cols”已重命名为“columns”,并且在最新版本的熊猫中,参数“engine”已被弃用(不再可用)。此外,此错误已在 0.19.0 版本中修复。

【讨论】:

  • 用最近的 pandas (0.19.2) 尝试这个解决方案会得到:TypeError: to_csv() got an unexpected keyword argument 'cols' API 改变了吗?
  • 相信此选项已被弃用,因为不再需要。
  • 好像改名为columns。将 cols 更改为 columns 现在对我有用。
  • 列名事先不知道怎么办?
  • 只获取列名? df.columns
【解决方案2】:

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

例如,如果您有一个包含 a、b、c、d 列的 csv:

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

【讨论】:

    【解决方案3】:

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

    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)
    

    【讨论】:

    • 这是唯一对我有用的解决方案。您可以通过一步重新排序和创建 CSV 来减少一行代码。
    猜你喜欢
    • 2016-09-25
    • 2015-12-08
    • 2016-09-01
    • 1970-01-01
    • 2018-11-06
    • 2013-09-08
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    相关资源
    最近更新 更多