这是我的代码:
import os
import pandas as pd
path = os.getcwd()
files = os.listdir(path)
df = pd.DataFrame()
for f in files:
data = pd.read_csv(f, usecols = ['A','B','C','D','E'])
df = df.append(data)
我得到了回溯:
File "C:\Users\dbhadra\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py", line 1134, in _validate_usecols_names
"columns expected but not found: {missing}".format(missing=missing)
ValueError: Usecols do not match columns, columns expected but not found: ['B', 'A', 'C', 'E', 'D']
我以前在read_excel
中使用过类似的命令,并且可以正常工作。我是否需要包含sep/engine
参数?我不明白为什么。另外,我可以像在read_excel中一样使用usecol = 'A:E'
吗? csv文件非常有用。没有技巧
答案 0 :(得分:1)
在Excel中,您具有主列命名(A-Z,AA-ZZ ...)。在CSV中,您还没有。 usecols
是根据列标题(在第一行中)的列表。如果CSV文件中没有标题,则只需删除usecols
,即可在以后删除这些列。或者,您可以将列指定为整数(例如usecols=(1, 3, 7)
而不是usecols=(A, C, F)
。如果有标题,请在usecols
中写出它们的名称。
usecols : list-like or callable, optional
返回列的子集。如果是类列表,则所有元素都必须是位置(即文档列中的整数索引)或字符串,这些字符串对应于用户以名称提供或从文档标题行推断出的列名称。例如,有效的类似列表的usecols参数将是
[0, 1, 2]
或['foo', 'bar', 'baz']
。元素顺序被忽略,因此usecols=[0, 1]
与[1, 0]
相同。要从保留元素顺序的数据实例化DataFrame,请对pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']]
顺序的列使用['foo', 'bar']
或对pd.read_csv(data, usecols=['foo', 'bar'])[['bar', 'foo']]
顺序的列使用['bar', 'foo']
。如果可调用,则将根据列名称对可调用函数进行求值,并在可调用函数求值为True的情况下返回名称。有效的可调用参数的示例为
lambda x: x.upper()
中的['AAA', 'BBB', 'DDD']
。使用此参数可以大大缩短解析时间并降低内存使用量。
答案 1 :(得分:1)
比较pandas.read_csv和pandas.read_excel的文档
read_csv()
:
u secols:类似于列表或可调用的列表,可选
返回列的子集。如果是类列表,则所有元素必须是位置(即文档列中的整数索引)或字符串,这些字符串与用户以名称提供或从文档标题行推断出的列名称相对应。例如,有效的类似列表的usecols参数应为[0,1,2]或['foo','bar','baz']
和read_excel()
usecols:int,str,类似于列表或可调用的默认值
返回列的子集。 *如果为None,则解析所有列。 *如果为int,则表示要解析的最后一列。
从0.24.0版开始不推荐使用:将int列表从0传递给usecols(含)。
如果为str,则表示Excel列字母和列范围的逗号分隔列表(例如“ A:E”或“ A,C,E:F”)。范围包括双方。
如果为int列表,则表示要解析的列号列表。
如果为字符串列表,则表示要解析的列名称列表。
因此,在您的情况下,您可以传递标头中的列名称或整数列表(列索引)