#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