Импортировать данные с pandas read_csv: заголовок с ошибкой в ​​две строки - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь импортировать данные из текстового файла, используя pandas. Данные выглядят так:

  Step            Time    Pressure z=0  MoleFrac 1 z=0  MoleFrac 2 z=0   Mole flow z=0
 [Int]       [seconds]         [bar.a]             [-]             [-]       [gmole/s]
     1       0.0000000  7.75425808E-01  1.30000000E-01  8.70000000E-01  6.00000000E-02
     2       0.0556727  7.67785502E-01  1.30000000E-01  8.70000000E-01  6.00000000E-02
     3       0.5673533  7.18327020E-01  1.30000000E-01  8.70000000E-01  6.00000000E-02

Я пытался сделать это так:

import pandas as pd
data = pd.read_csv('filename.txt', delimiter="\s+", header=[0,1])

Это работает, если я использую только одну строку для заголовка, но как только я добавляю 2-й, я получаю сообщение об ошибке:

IndexError: list index out of range

Есть идеи?

1 Ответ

0 голосов
/ 06 августа 2020

Попробуйте:

df = pd.read_csv(r"filename.txt",  delimiter="\s{2,}", header=[0,1], engine='python')

Если engine установлено на python, тогда можно использовать регулярное выражение в качестве разделителя.

Результат:

   Step      Time Pressure z=0 MoleFrac 1 z=0 MoleFrac 2 z=0 Mole flow z=0
  [Int] [seconds]      [bar.a]            [-]            [-]     [gmole/s]
0     1  0.000000     0.775426           0.13           0.87          0.06
1     2  0.055673     0.767786           0.13           0.87          0.06
2     3  0.567353     0.718327           0.13           0.87          0.06

Поскольку в именах столбцов есть одиночные пробелы, я обнаружил, что разделитель должен состоять как минимум из 2 пробелов " ", что выражается как \s{2,}.

Проверить df.columns:

MultiIndex([(          'Step',     '[Int]'),
            (          'Time', '[seconds]'),
            (  'Pressure z=0',   '[bar.a]'),
            ('MoleFrac 1 z=0',       '[-]'),
            ('MoleFrac 2 z=0',       '[-]'),
            ( 'Mole flow z=0', '[gmole/s]')],
           )

, чтобы итоговый фрейм данных выглядел правильно.

...