首页 文章

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

提问于
浏览
2

关于 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 回答

  • 2

    我相信这是对 usecols 的误解 . documentation并不建议列以参数中显示的相同顺序返回 .

    usecols:array-like或callable,default无返回列的子集 . 如果类似于数组,则所有元素必须是位置(即文档列中的整数索引)或与用户名称或从文档 Headers 行推断的列名对应的字符串 . 例如,一个有效的类似数组的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')
    

相关问题