关于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
的最后位置。
答案 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')