熊猫:CSV输入的列与“名称”字段中定义的列不同

时间:2019-09-01 20:02:57

标签: python pandas csv dataframe parsing

我正在使用Python Pandas读取CSV文件:

col1\tcol2\tcol3\tcol4\tcol5

因此,原则上,此文件包含一行和5列,并用制表符'\ t'分隔。

在读取文件时,我会指定一个名称列表,就像这样(我假设我的文件应该有3列,而不是上面的5列):

df = pd.read_csv("test.txt", sep = "\t", names = ["COL1", "COL2", "COL3"])

Panda并没有抱怨,实际上,当我打印它时,它需要前三列并将其读为第一列,所以当我打印DataFrame时,我得到以下信息:

print(df.head())
                COL1    COL2    COL3
col1    col2    col3    col4    col5

对我来说,这意味着文件格式错误,但是我不知道如何捕获此程序化代码,例如当我检查列的大小时,它返回3(我定义的列数),并且如果我检查DataFrame的形状,它还返回列号3。

我的问题是,如何检测尝试使用read_csv加载的文件包含一定数量的列?当然,我可以按照传统方式读取罚款的第一行,进行解析并检查其内容,但是有没有办法使用熊猫来做到这一点?

1 个答案:

答案 0 :(得分:2)

我认为没有错。熊猫假设只有三列,因为您只给了3个名字。

例如,如果我这样做:

import io
raw="""col1\tcol2\tcol3\tcol4\tcol5
1\t2\t3\t4\t5"""
df= pd.read_csv(io.StringIO(raw), sep='\t')

我知道

Out[545]: 
   col1  col2  col3  col4  col5
0     1     2     3     4     5

但是,如果像您的示例一样设置三列的名称,则会得到:

df= pd.read_csv(io.StringIO(raw), sep='\t', names = ["COL1", "COL2", "COL3"])
Out[547]: 
           COL1  COL2  COL3
col1 col2  col3  col4  col5
1    2        3     4     5

所以现在这取决于您实际想要做什么。 如果您想跳过标题而只阅读前三列,则可以执行以下操作:

df= pd.read_csv(io.StringIO(raw), sep='\t', usecols=range(3), names = ["COL1", "COL2", "COL3"], skiprows=1)

Out[549]: 
   COL1  COL2  COL3
0     1     2     3

如果您想阅读全部内容并替换前三列的名称,则可以这样做:

df= pd.read_csv(io.StringIO(raw), sep='\t')
df.columns= ["COL1", "COL2", "COL3"] + list(df.columns)[3:]