Pandas read_csv不知道是否存在标头

lee*_*sky 8 python csv pandas

我有一个包含已知列的输入文件,让我们说两列NameSex.有时它有标题行Name,Sex,有时它不会:

1.csv:

Name,Sex
John,M
Leslie,F
Run Code Online (Sandbox Code Playgroud)

2.csv:

John,M
Leslie,F
Run Code Online (Sandbox Code Playgroud)

事先了解了列的身份,是否有一种很好的方法可以使用相同的read_csv命令处理这两种情况?基本上,我想指定names=['Name', 'Sex'],然后header=0只在标题存在时推断它.我能想出的最好的是:

  • 1)在执行之前读取文件的第一行read_csv,并适当地设置参数.

  • 2)只需这样做df = pd.read_csv(input_file, names=['Name', 'Sex']),然后检查零行是否与标题相同,如果是,则删除它(然后可能必须重新编号行).

但这对我来说似乎并不像用例那么不寻常.是否有一种内置的方式来做这个read_csv我没有想到的?

Max*_*axU 7

使用新功能 - 通过可调用选择:

cols = ['Name','Sex']

df = (pd.read_csv(filename, header=None, names=cols)
      [lambda x: np.ones(len(x)).astype(bool)
                 if (x.iloc[0] != cols).all()
                 else np.concatenate([[False], np.ones(len(x)-1).astype(bool)])]
)
Run Code Online (Sandbox Code Playgroud)

使用.query()方法:

df = (pd.read_csv(filename, header=None, names=cols)
        .query('Name != "Name" and Sex != "Sex"'))
Run Code Online (Sandbox Code Playgroud)

我不确定这是最优雅的方式,但这也应该有效:

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

if (df.iloc[0] == cols).all():
    df = df[1:].reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

  • 感谢所有选择!最后一个版本对我来说仍然看起来最干净,所以我想我会用这种方法.我现在暂时打开这个问题,如果没有别的办法,我会在几天后接受. (2认同)