Как анализировать и агрегировать журнал в фрейм данных (3 строки в 1 строку)?

Вот мой набор данных

Month  Date Time        Log                                                                                      Command    
Apr    4    20:30:33    200.200.200.254 dns,packet person: --- got query from 10.10.10.243:30648:                Query
Apr    4    20:30:33    200.200.200.254 dns,packet person: id:78b1 rd:1 tc:0 aa:0 qr:0 ra:0 QUERY 'no error'     Not Command
Apr    4    20:30:33    200.200.200.254 dns,packet person: question: home.twitter.com:a:IN                       Not Command
Apr    4    20:30:34    200.200.200.254 dns,packet person: --- sending udp query to 200.10.10.10:53              Sending
Apr    4    20:30:34    200.200.200.254 dns,packet person: id:99a1 rd:1 tc:0 aa:0 qr:0 ra:0 QUERY 'no error'     Not Command
Apr    4    20:30:34    200.200.200.254 dns,packet person: question: home.twitter.com:a:IN                       Not Command

В этом наборе данных я хочу сделать каждые 3 строки строками, но на самом деле я хочу сделать это одной строкой, ограничение всегда составляет 3 строки в 1 строку, и да, команда является первой строкой из 3 строки, потому что мне нужно сделать для целей машинного обучения

Ниже ожидаемого результата:

Month  Date  Time        Command        IP1                    IP2                           user      id      url                 message        
Apr    4     20:30:33    Query          200.200.200.254        10.10.10.243:30648            person    78b1    home.twitter.com    no error
Apr    4     20:30:34    Sending        200.200.200.254        200.10.10.53                  person    99a1    home.twitter.com    no error

Каковы ограничения для сжатия строк в одну строку. Например, как извлечь IP1 и IP2? Кроме того, всегда ли команда будет первой командой?

hacker315 10.04.2019 08:47

Потому что мне нужно для машинного обучения @hacker315

Nabih Bawazir 10.04.2019 08:47

ограничение всегда 3 строки в 1 строку, и да, команда является первой строкой из 3 строк @hacker315

Nabih Bawazir 10.04.2019 09:32

Насколько я вижу, первая строка из каждых трех строк содержит всю необходимую информацию. Отбросьте 2-ю и 3-ю строки, а затем проанализируйте первую строку каждой группы из трех. Разве это не так?

Spinor8 10.04.2019 10:07

Сбросить индекс, а затем df[df.index % 3 == 0]?

run-out 10.04.2019 10:08

@ Spinor8 Да, это так

Nabih Bawazir 10.04.2019 11:33

@run-out да это

Nabih Bawazir 10.04.2019 11:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался использовать ул.экстракт с регулярным выражением. Надеюсь, я не сделал слишком много предположений с вашими данными

df

Month   Date        Time                                                 Log     Command
  Apr      4    20:30:33    200.200.200.254 dns,packet person: --- got que...   Query
  Apr      4    20:30:33    200.200.200.254 dns,packet person: id:78b1 rd:...   Not Command
  Apr      4    20:30:33    200.200.200.254 dns,packet person: question: h...   Not Command
  Apr      4    20:30:34    200.200.200.254 dns,packet person: --- sending...   Sending
  Apr      4    20:30:34    200.200.200.254 dns,packet person: id:99a1 rd:...   Not Command
  Apr      4    20:30:34    200.200.200.254 dns,packet person: question: h...   Not Command

data = df.reset_index()
data.columns = ["month_name"] + list(data.columns)[1:]

new_df = pd.DataFrame()
new_df = data[data.index % 3 == 0]

new_df['IP2'] = data[data.index % 3 == 0].Log.str.extract(r'(\d*.\d*.\d*.\d*:\d*)?:*$').values

new_df['IP1'] = data[data.index % 3 == 0].Log.str.extract(r'(\d*.\d*.\d*.\d*)\s').values

new_df['user'] = data[data.index % 3 == 1].Log.str.extract(r'(\w*):\s-*').values

new_df['id'] = data[data.index % 3 == 1].Log.str.extract(r'id:(\w*)\s').values

new_df['message'] = data[data.index % 3 == 1].Log.str.extract(r"'(\w*\s*\w*)'").values

new_df['url'] = data[data.index % 3 == 2].Log.str.extract(r'question:\s*(\w*.+):\w*:').values

new_df = new_df.drop(columns=["Log"]).set_index("month_name", drop=True)
new_df.columns.name = "Month"
new_df.index.name = None
new_df

Month   Date        Time    Command           IP2                  IP1        user  id      message           url
Apr        4    20:30:33    Query      10.10.10.243:30648   200.200.200.254 person  78b1    no error    home.twitter.com
Apr        4    20:30:34    Sending    200.10.10.10:53      200.200.200.254 person  99a1    no error    home.twitter.com

Другие вопросы по теме