使用pandas读取包含多行标题的文本文件

时间:2017-09-26 21:53:27

标签: python file pandas dataframe

我有以下文件:

        OBJ             OBJ     OBJ                                                                                           
       DATE        OBJ  CLASS  DATE        OBJ                                       OBJ                         OBJ          
CLASS  ENTERED1    TAG  REPL   ENTERED2    NAME                                      TSTMP                       USERID       
-----  ----------  ---  -----  ----------  ----------------------------------------  --------------------------  --------     
EZ4    2002-02-06  D           2002-02-06  abc random                                2002-02-06-10.05.30.242768  2342342      
000    2001-09-27  D           2001-09-27  none                                      2001-09-27-10.23.31.121606  2343242      
011    1974-07-09              0001-01-01  board COMPENSATON                         1997-01-22-09.10.23.145853  

列用下划线定义,标题文本分为多行。我想把它读成一个pandas数据帧,这样列文本就完整了,下划线就被删除了。我该怎么做才能以我正在寻找的格式获取数据帧?

3 个答案:

答案 0 :(得分:2)

我将pd.read_fwf用于固定宽度,但指定'\s{2,}'

的分隔符
g = lambda x: '' if x.startswith('Unnamed') else x

pd.read_fwf(
    'file.txt',
    sep='\s{2,}',
    header=[0, 1, 2],
    skiprows=[3]
).rename(columns=g)

                OBJ        OBJ                                                                      
               DATE  OBJ CLASS        DATE                OBJ                                       
  CLASS    ENTERED1  TAG  REPL    ENTERED2               NAME                       TSTMP     USERID
0   EZ4  2002-02-06    D   NaN  2002-02-06         abc random  2002-02-06-10.05.30.242768  2342342.0
1   000  2001-09-27    D   NaN  2001-09-27               none  2001-09-27-10.23.31.121606  2343242.0
2   011  1974-07-09  NaN   NaN  0001-01-01  board COMPENSATON  1997-01-22-09.10.23.145853        NaN

答案 1 :(得分:1)

看起来前两行和第三行是不必要的,因此请通过指定skiprows属性跳过它们。

df = pd.read_csv('file.txt', skiprows=(0, 1, 3), sep='\s{2,}', engine='python')

答案 2 :(得分:0)

在到达下划线之前存储文本信息。当你到达下划线时,保存每个"列的开始和结束位置"然后返回并根据需要连接该文本。考虑写一个可重用的函数......总有一天你需要做这样的事情: - )