Не удается отобразить текстовый столбец при разделении текста на связанную таблицу

#python #regex #pandas #text

#python #регулярное выражение #pandas #текст

Вопрос:

Вот мой набор данных (только один столбец)

 Apr 1 09:14:55 i have apple
Apr 2 08:10:10 i have mango
  

Вот результат, который мне нужен

 month  date      time       message
Apr    1     09:14:55  i have apple
Apr    2     09:10:10  i have mango
  

Это то, что я сделал

 import pandas as pd

month = []
date = []
time = []
message = []

for line in dns_data:
   month.append(line.split()[0])
   date.append(line.split()[1])
   time.append(line.split()[2])

df = pd.DataFrame(data={'month': month, 'date':date, 'time':time})
  

Это результат, который я получаю

     month     date      time
0     Apr     1     09:14:55
1     Apr     2     09:10:10
  

Как отобразить message столбец?

Комментарии:

1. df1 = df['data'].str.extract(r'^(?P<month>S )s (?P<date>d )s (?P<time>S )s (?P<message>.*)')

Ответ №1:

Используйте параметр n in Series.str.split для разделения на первые 3 пробела, expand=True для вывода DataFrame :

 print (df)
                           col
0  Apr 1 09:14:55 i have apple
1  Apr 2 08:10:10 i have mango

df1 = df['col'].str.split(n=3, expand=True)
df1.columns=['month','date','time','message']
print (df1)
  month date      time       message
0   Apr    1  09:14:55  i have apple
1   Apr    2  08:10:10  i have mango
  

Другое решение с пониманием списка:

 c = ['month','date','time','message']
df1 = pd.DataFrame([x.split(maxsplit=3) for x in df['col']], columns=c)
print (df1)
  month date      time       message
0   Apr    1  09:14:55  i have apple
1   Apr    2  08:10:10  i have mango
  

Ответ №2:

Вы могли бы использовать Series.str.extractall шаблон регулярных выражений:

 df = pd.DataFrame({'text': {0: 'Apr 1 09:14:55 i have apple', 1: 'Apr 2 08:10:10 i have mango'}})
df_new = (df.text.str
          .extractall(r'^(?P<month>w{3})s?(?P<date>d{1,2})s?(?P<time>d{2}:d{2}:d{2})s?(?P<message>.*)$')
          .reset_index(drop=True))
print(df_new)

  month date      time       message
0   Apr   1  09:14:55  i have apple
1   Apr   2  08:10:10  i have mango
  

Ответ №3:

Это может вам помочь.

 (?<Month>w )s(?<Date>d )s(?<Time>[w:] )s(?<Message>.*)

Match 1
Month   Apr
Date    1
Time    09:14:55
Message i have apple
Match 2
Month   Apr
Date    2
Time    08:10:10
Message i have mango
  

https://rubular.com/r/1S4BcbDxPtlVxE