Разобрать необработанные текстовые данные и извлечь определенное значение в Python - PullRequest
1 голос
/ 13 марта 2020

Один из столбцов в моей базе данных хранит текстовую информацию в указанном ниже формате. Текст не в стандартном формате, иногда перед полем «Дата страхования» может быть дополнительный текст. Когда я делю раздел в Python, он может поместить эту «дату страхования» в разные столбцы. Мне нужно найти значение «Дата страхования во всех столбцах в этом случае».

Образец текста

"Accumulation Period - period of time insured must incur eligible medical expenses at least equal to the deductible amount in order to establish a benefit period under a major medical expense or comprehensive medical expense policy.\n
Insurance Date 12/17/2018\n
Insurance Number 235845\n
Carrier Name SKGP\n
Coverage $240000"

Ожидаемый результат

INS_NO     Insurance Date     Carrier Name
235845    12/17/2018          SKGP   

Как анализировать необработанные текстовую информацию, подобную этой, и извлечение значения даты страхования

Я использую приведенную ниже логику c, чтобы извлечь это, но я не знаю, как извлечь дату в другой столбец

df= pd.read_sql(query, conn)
df2=df["NOTES"].str.split("\n", expand=True)

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Использовать регулярное выражение

Если текст следует за шаблоном (более или менее), вы можете использовать regex.
См. Документацию python для операций с регулярными выражениями здесь .

Пример

Посмотрите и попробуйте с кодом двух возможных решений здесь .
Ниже вы можете найти упрощенный пример.

text = """
Accumulation Period - period of time insured must incur eligible medical expenses at least equal to the deductible amount in order to establish a benefit period under a major medical expense or comprehensive medical expense policy.
Insurance Date 12/17/2018
Insurance Number 235845
Carrier Name SKGP
Coverage $240000
"""

pattern = re.compile(r"Insurance Date (.*)\nInsurance Number (.*)\nCarrier Name (.*)\n")

match = pattern.search(text)

print("Found:")
if match:
    for g in match.groups():
        print(g)

Выход

Found:
12/17/2018
235845
SKGP
0 голосов
/ 13 марта 2020

Если я вас правильно понимаю, это может приблизить вас к тому, что вам нужно:

insurance = """
"Accumulation Period - period of time insured must incur eligible medical expenses at least equal to the deductible amount in order to establish a benefit period under a major medical expense or comprehensive medical expense policy.\n
Insurance Date 12/17/2018\n
Insurance Number 235845\n
Carrier Name SKGP\n
Coverage $240000"
"""

items = insurance.split('\n')
filtered_items = list(filter(lambda x: x != "", items))
del filtered_items[0]
del filtered_items[-1]
row = []
for item in filtered_items:
    row.append(item.split(' ')[-1])

columns = ["INS_NO ", "Insurance Date", "Carrier Name"]      
df = pd.DataFrame([row],columns=columns)
df

Вывод:

    INS_NO  Insurance Date  Carrier Name
0   12/17/2018  235845     SKGP
...