Python 熊猫读取_csv时不知道是否存在标头

Python 熊猫读取_csv时不知道是否存在标头,python,csv,pandas,Python,Csv,Pandas,我有一个包含已知列的输入文件,比如两列Name和Sex。有时它有标题行Name,Sex,有时它没有: 1.csv: Name,Sex John,M Leslie,F John,M Leslie,F 2.csv: Name,Sex John,M Leslie,F John,M Leslie,F 事先知道列的标识,是否有一种好方法可以使用相同的read\u csv命令处理这两种情况?基本上,我想指定names=['Name','Sex'],然后让它仅在头存在时推断header=0。我能想到的

我有一个包含已知列的输入文件,比如两列
Name
Sex
。有时它有标题行
Name,Sex
,有时它没有:

1.csv

Name,Sex
John,M
Leslie,F
John,M
Leslie,F
2.csv

Name,Sex
John,M
Leslie,F
John,M
Leslie,F
事先知道列的标识,是否有一种好方法可以使用相同的
read\u csv
命令处理这两种情况?基本上,我想指定
names=['Name','Sex']
,然后让它仅在头存在时推断
header=0
。我能想到的最好办法是:

  • 1) 在执行读取csv之前读取文件的第一行,然后设置 参数适当

  • 2) 只需执行
    df=pd.read\u csv(输入文件,名称=['Name','Sex'))
    , 然后检查第零行是否与标题相同,如果 所以放下它(然后可能需要对行重新编号)

但对我来说,这并不是一个不寻常的用例。是否有一种内置的方法可以使用我没有想到的
read\u csv
来实现这一点?

使用新功能-:

使用方法:

我不确定这是否是最优雅的方式,但这也应该适用:

df = pd.read_csv(filename, header=None, names=cols)

if (df.iloc[0] == cols).all():
    df = df[1:].reset_index(drop=True)

我想出了一种在事先不知道标题名称的情况下检测标题的方法:

如果有(df.iloc[0]。应用(lambda x:isinstance(x,str)):
df=df[1:]重置索引(drop=True)
通过稍微更改,它可以使用检测到的标题更新当前标题:

如果有(df.iloc[0]。应用(lambda x:isinstance(x,str)):
df=df[1:]。重置索引(drop=True)。重命名(columns=df.iloc[0])
这将允许轻松选择所需的行为:

update_header=True
如果有(df.iloc[0].apply(lambda x:isinstance(x,str)):
新的_头=df.iloc[0]
df=df[1:]重置索引(drop=True)
如果更新\u头:
重命名(列=new_头,inplace=True)
优点:

  • 不需要事先知道标题的名称
  • 可用于在检测到现有标题时自动更新标题
缺点:

  • 如果数据包含字符串,则无法正常工作。替换
    if any()
    以要求所有元素都是字符串可能会有所帮助,除非数据还包含整行字符串

感谢您提供的所有选项!最后一个版本在我看来仍然是最干净的,所以我想我会使用这种方法。我将暂时不回答这个问题,如果没有其他问题,我将在几天后接受。感谢您提供的有用答案,对于我来说,我必须在read_csv中设置index_col=False,以便在有标题时对齐第一行。