在pandas中读取csv时自动确定标题行

Mae*_*ex1 8 python csv pandas

我正在尝试从共享相同列名称的不同 .csv 文件收集数据。但是,某些 csv 文件的标题位于不同的行中。

有没有办法根据包含“大多数”值(实际标题名称)的第一行动态确定标题行?

我尝试了以下方法:

def process_file(file, path, col_source, col_target):
    global df_master
    print(file)
    df = pd.read_csv(path + file, encoding = "ISO-8859-1", header=None)
    df = df.dropna(thresh=2) ## Drop the rows that contain less than 2 non-NaN values. E.g. metadata
    df.columns = df.iloc[0,:].values
    df = df.drop(df.index[0])
Run Code Online (Sandbox Code Playgroud)

但是,当使用 时pandas.read_csv(),似乎第一个值决定了实际数据帧的大小,因为我收到以下错误消息:

pandas.errors.ParserError:标记数据时出错。C 错误:第 4 行应有 1 个字段,结果为 162

正如您在本例中看到的,标题行将位于第 4 行。添加error_bad_lines=False到 read_csv 时,只有元数据会被读入数据帧。

这些文件可以具有以下结构:

一个“普通”文件:

row1    col1   col2    col3    col4   col5   
row2    val1   val1    val1    val1   val1
row3    val2   val2    val2    val2   val2   
row4
Run Code Online (Sandbox Code Playgroud)

或标题前带有元数据的结构:

row1   metadata1    
row2   metadata2
row3   col1   col2    col3    col4   col5
row4   val1   val1    val1    val1   val1
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助!

Ser*_*sta 3

恕我直言,如果暂时忘记熊猫,最简单的方法是:

  • 您将文件作为文本文件打开以供阅读
  • 你开始逐行解析它,猜测该行是否是
    • 元数据标头
    • 真正的标题行
    • 数据线

一种简单的方法是将所有从真实标题行开始的行连接到一个字符串中(让我们称之为buffer),然后使用pd.read_csv(io.StringIO(buffer), ...)