Вот мой набор данных
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
Потому что мне нужно для машинного обучения @hacker315
ограничение всегда 3 строки в 1 строку, и да, команда является первой строкой из 3 строк @hacker315
Насколько я вижу, первая строка из каждых трех строк содержит всю необходимую информацию. Отбросьте 2-ю и 3-ю строки, а затем проанализируйте первую строку каждой группы из трех. Разве это не так?
Сбросить индекс, а затем df[df.index % 3 == 0]?
@ Spinor8 Да, это так
@run-out да это
Я попытался использовать ул.экстракт с регулярным выражением. Надеюсь, я не сделал слишком много предположений с вашими данными
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
Каковы ограничения для сжатия строк в одну строку. Например, как извлечь IP1 и IP2? Кроме того, всегда ли команда будет первой командой?