Я довольно новичок в python, поэтому кто-то может прокомментировать, если это не очень хороший подход.Мое мышление состояло в том, чтобы взять ввод и обработать его построчно.отбросьте конечную точку с запятой, поскольку у вас ее нет в выводе.затем с помощью регулярных выражений разделите строку на пробел, только если за ней следует OPR или GDP, а не в конце строки.Если это дает только один элемент в списке, тогда добавьте список с NaN, чтобы заполнить второй столбец.затем я напечатал с форматированием.
import re
data_string="""12 364 OPR 4 67474;
893 73 GDP hdj 747;
hr 777 hr9 GDP;
463 7g 448 OPR;
"""
data_list=data_string.splitlines()
for data in data_list:
data_split=re.split("\s(?=(?:GDP|OPR)[^$])",data[:-1])
if len(data_split)==1: data_split.append("NaN")
print("%-20s|%-20s" % tuple(data_split))
ВЫВОД
12 364 |OPR 4 67474
893 73 |GDP hdj 747
hr 777 hr9 GDP |NaN
463 7g 448 OPR |NaN
Обновлено в свете вопросов редактирования и комментариев
На основе вашего обновленияна вопрос и комментарии вы можете попробовать ниже.Я бы посоветовал вам проверить это и проверить наличие крайних случаев или добавить проверки или условные проверки перед выполнением обновлений.
import pandas as pd
import re
source_data = {'data': ['12 364 OPR 4 67474', '893 73 GDP hdj 747', 'hr 777 hr9 GDP','463 7g 448 OPR'],
'code': [None, None, None, None],
'Temp': [33,34,30,28]
}
df = pd.DataFrame.from_dict(source_data)
print("Original df:")
print(df, "\n")
row_iter=df.iterrows()
for index,row in row_iter:
data=df.at[index,'data']
data_split=re.split("\s(?=(?:GDP|OPR)[^$])",data)
if len(data_split)==2:
df.at[index,'data']=data_split[0]
df.at[index,'code']=data_split[1]
print("Updated df:")
print(df)
OUTPUT
Original df:
data code Temp
0 12 364 OPR 4 67474 None 33
1 893 73 GDP hdj 747 None 34
2 hr 777 hr9 GDP None 30
3 463 7g 448 OPR None 28
Updated df:
data code Temp
0 12 364 OPR 4 67474 33
1 893 73 GDP hdj 747 34
2 hr 777 hr9 GDP None 30
3 463 7g 448 OPR None 28