Pandas读取没有列名的表格

387
使用pandas,如何读取没有标题的.csv文件的子集列(例如第4列和第7列)?我似乎无法使用usecols实现。
5个回答

556
为了读取一个没有标题行的CSV,并且只读取特定列,您需要传递参数header=Noneusecols=[3,6]来读取第4列和第7列:
df = pd.read_csv(file_path, header=None, usecols=[3,6])

请查看文档


177

之前的回答都是正确的,但在我看来,额外添加一个names参数将使它更加完善,并且应该成为推荐的方式,特别是当csv没有headers时。

解决方案

使用usecolsnames参数

df = pd.read_csv(file_path, usecols=[3,6], names=['colA', 'colB'])

更多阅读材料

或者使用header=None来明确告诉人们csv没有标题(不管怎样,这两行都是相同的)。

df = pd.read_csv(file_path, usecols=[3,6], names=['colA', 'colB'], header=None)

这样您就可以通过

检索到您的数据。
# with `names` parameter
df['colA']
df['colB'] 

取代

# without `names` parameter
df[0]
df[1]

解释

根据 read_csv 的说明,当显式传递 names 参数时,header 参数行为类似于 None 而不是 0,所以当存在 names 参数时,可以跳过 header=None 参数。


2
我真的不明白为什么文档中解释得如此不清楚。他们只在其中提到了一次 header=None,并且是这样说的:“然后行为与 header=None 相同”。但是这种行为是什么?它根本没有被提到。我应该将其视为应该避免使用 header=None 而改用 names 吗? - Alexander Myasnikov

17

请确保您指定传递header=None并添加 usecols=[3,6] 用于第4和第7列。


3
根据文档https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html: header int、int 列表,默认值 'infer' 要用作列名和数据开始的行号。默认情况下,会推断列名:如果没有传递名称,则行为等同于 header=0,并且列名从文件的第一行推断出来,如果显式传递了列名,则行为等同于header=None。显式传递 header=0 以替换现有名称。标题可以是包含列多级索引的整数列表,例如[0,1,3]。未指定的中间行将被跳过(例如,在此示例中跳过2)。请注意,如果skip_blank_lines=True,则此参数会忽略注释行和空行,因此header=0表示数据的第一行,而不是文件的第一行。
names array-like,可选 要使用的列名列表。如果文件包含标题行,则应显式传递 header=0 来覆盖列名。此列表中不允许重复项。
columts = ['Day', 'PLMN', 'RNCname']
tempo = pd.read_csv("info.csv", sep=';', header=0, names=columts, index_col=False)

0

您还可以使用header=None调用read_table()(将文件的第一行读取为数据的第一行):

df = pd.read_table('test.tsv', sep=',', usecols=[3,6], header=None)

如果分隔符是\t(如.tsv文件等),那么这个函数就会更有用,因为默认分隔符是\t(不像read_csv的默认分隔符是,)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接