Pandas在不知道标题是否存在的情况下读取_csv

ht4b089n  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(185)

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

1.csv格式

Name,Sex
John,M
Leslie,F

2.csv格式

John,M
Leslie,F

事先知道列的标识,有没有一种好方法可以用同一个read_csv命令处理这两种情况?基本上,我想指定names=['Name', 'Sex'],然后让它只在头存在时才推断header=0

  • 1)在执行read_csv之前读取文件的第一行,并适当地设置参数。
  • 2)只执行df = pd.read_csv(input_file, names=['Name', 'Sex']),然后检查第0行是否与标题相同,如果相同,则删除它(然后可能需要重新编号行)。

但是在我看来,这并不像是一个不寻常的用例,是否有一种我没有想到的内置的read_csv方法?

ar7v8xwq

ar7v8xwq1#

使用新功能-可调用项选择:

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)])]
)

使用.query()方法:

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

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

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

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

dbf7pr2w2#

我提出了一种无需事先知道头文件名称即可检测头文件的方法:

if any(df.iloc[0].apply(lambda x: isinstance(x, str))):
    df = df[1:].reset_index(drop=True)

并且通过稍微改变它,它可以用检测到的报头更新当前报头:

if any(df.iloc[0].apply(lambda x: isinstance(x, str))):
    df = df[1:].reset_index(drop=True).rename(columns=df.iloc[0])

这将允许容易地选择期望的行为:

update_header = True

if any(df.iloc[0].apply(lambda x: isinstance(x, str))):
    new_header = df.iloc[0]

    df = df[1:].reset_index(drop=True)

    if update_header:
        df.rename(columns=new_header, inplace=True)

优点:

  • 不需要事先知道头文件的名称。
  • 可用于在检测到现有标题时自动更新标题。
    缺点:
  • 如果数据中包含字符串,则效果不佳。替换if any()以要求所有元素都是字符串可能会有所帮助,除非数据中也包含整行字符串。

相关问题