为什么在处理带有pandas的csv文件时不保留列顺序?

时间:2018-02-17 16:19:00

标签: python pandas csv dataframe

关于pandas在阅读/编写csv文件时不尊重列的顺序,有很多问题,其中一些可以追溯到5年前(!):

根据this answer,这个" bug"已修复版本0.19.0但我运行Python 3.6.4和pandas 0.22.0,我仍然遇到此问题。

这是一个多年来一直存在的错误,还是pandas的工作原理?如果是这样,那么不保留列顺序背后的原因是什么?

您可以使用this csv file和以下代码重现该问题:

import pandas as pd
df = pd.read_csv(
    "test.csv", usecols=('Author', 'Title', 'Abstract Note', 'Url'))
print(df)

请注意,'Url'未定位在df的最后位置。

1 个答案:

答案 0 :(得分:2)

我认为这是对usecols所做的误解。 documentation并不建议列按照参数中显示的顺序返回。

  

usecols :类似数组或可调用,默认为无

     

返回列的子集。如果类似于数组,则所有元素必须是位置(即文档列中的整数索引)或对应于用户名称或从文档标题行推断的列名称的字符串。例如,一个有效的类似数组的usecols参数将是[0,1,2]或['foo','bar','baz']。

     

如果是可调用的,则将根据列名评估可调用函数,返回可调用函数求值为True的名称。有效可调用参数的一个例子是[' AAA'' BBB',' DDD']中的lambda x:x.upper()。使用此参数可以大大加快解析时间并降低内存使用率。

实际上列的返回顺序与它们在文件中的顺序相同。

cols = ['Author', 'Title', 'Abstract Note', 'Url']

with open('test.csv') as fh:
    print('\n'.join(filter(lambda x: x in cols, fh.readline().split(','))))

Author
Title
Url
Abstract Note

当我们阅读文件时:

df = pd.read_csv(
    "test.csv", usecols=('Author', 'Title', 'Abstract Note', 'Url'))

df.columns

Index(['Author', 'Title', 'Url', 'Abstract Note'], dtype='object')

我们看到相同的列顺序。

而是使用您想要的顺序对结果数据帧进行切片。

cols = ['Author', 'Title', 'Abstract Note', 'Url']
df = pd.read_csv('test.csv', usecols=cols)[cols]

df.columns

Index(['Author', 'Title', 'Abstract Note', 'Url'], dtype='object')