我正在使用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加载的文件包含一定数量的列?当然,我可以按照传统方式读取罚款的第一行,进行解析并检查其内容,但是有没有办法使用熊猫来做到这一点?
答案 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:]