Жадный слева и правый жадный столбец при чтении текстовых файлов в Pandas - PullRequest
1 голос
/ 20 октября 2019

Допустим, у нас есть файл log , который содержит строки, подобные следующим:

Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico

Это , а не файл CSV. Однако, если предположить:

  • sep=' '
  • 3 столбца

, теоретически можно загрузить этот файл в фрейм данных как минимум в двумя способами:

Left-Greedy

  • Столбцы 1 и 2 назначены для sep=' ' -сплит, а Столбец 3 назначен любому тексту, остающемуся в концекаждой строки
  • Это приведет к:

    • Col1 = Mar-13-19:04:13
    • Col2 = [error]
    • Col3 =File does not exist: /var/www/favicon.ico

Жадный вправо

  • Столбцы 2 и 3 назначены для sep=' ' -сплит, а Столбец 1 - любомутекст остается в начале каждой строки.
  • Это приведет к:

    • Col1 = Mar-13-19:04:13 [error] File does not
    • Col2 = exist:
    • Col3 = /var/www/favicon.ico

При этом мои вопросы:

  • Как я могу загрузить этот файл вПанды, использующие шаблон left-жадный ?
  • Если я укажу error_bad_lines=False в read_csv, будет ли Панда следовать схеме влево-жадный ? правосторонний шаблон? или ничего из вышеперечисленного?

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вы можете прочитать в полном файле журнала как фрейм данных с 1 столбцом. Затем используйте str.split с expand=True, который расширяет каждый список до своего собственного столбца:

txt = StringIO('''Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico
Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico
Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico
Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico
Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico
''')

left_greedy = True

# read in text file as one big dataframe
df = pd.DataFrame(txt)

if left_greedy:
    df = df[0].str.split(pat=' ', n=2, expand=True)
else:
    df = df[0].str.rsplit(pat=' ', n=2, expand=True)

# assign correct column names
df.columns = ['Col1', 'Col2', 'Col3']

Выход left_greedy=True

              Col1     Col2                                         Col3
0  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico\n
1  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico\n
2  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico\n
3  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico\n
4  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico\n

Выходleft_greedy=False

                                    Col1    Col2                    Col3
0  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico\n
1  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico\n
2  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico\n
3  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico\n
4  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico\n

Метод резервного копирования, работающий, например, на строке:

Вы можете использовать метод vanilla split, чтобы упорядочить это, разделив его слева или справа. ,Затем конструктор pandas DataFrame для определения вашего фрейма данных:

txt = "Mar-13-19:04:13 [error] File does not exist: /var/www/favicon.ico"

left_greedy = True

if left_greedy:
    txt = txt.split(' ', 2)
else:
    txt = txt.rsplit(' ', 2)

df = pd.DataFrame(np.column_stack(txt), columns=['Col1', 'Col2', 'Col3'])

Вывод

              Col1     Col2                                       Col3
0  Mar-13-19:04:13  [error]  File does not exist: /var/www/favicon.ico

Если мы установим left_greedy = False, мы получим:

                                    Col1    Col2                  Col3
0  Mar-13-19:04:13 [error] File does not  exist:  /var/www/favicon.ico
1 голос
/ 20 октября 2019

По умолчанию, pandas возвращает фрейм данных, похожий на шаблон с жадностью вправо, с остальным текстом, назначенным для индекса.

from io import StringIO
data = """Mar-13-19:04:13 [error] client File does not exist: /var/www/favicon.ico"""
pd.read_csv(StringIO(data), sep = ' ', names = ['a','b','c'])


                                                a   b       c
Mar-13-19:04:13 [error] client  File    does    not exist:  /var/www/favicon.ico

Один из способов - это прочитать данные в одном столбце и извлечь нужные значения с помощью регулярных выражений,

df = pd.read_csv(StringIO(data), names = ['data'])
df['data'].str.extract('(?P<a>.*)\s\[(?P<b>.*)\]\s(?P<c>.*)')

Вы получите

    a               b       c
0   Mar-13-19:04:13 error   client File does not exist: /var/www/favicon.ico
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...