Как разграничить текст, хранящийся в переменной, для создания кадра данных в Python?

Я проанализировал pdf file с использованием моделей искусственного интеллекта и получил результаты анализа markdown, которые сохраняются в переменной doc_parsed. Распечатываем ниже образец содержимого по коду print(doc_parsed[2].text[:1000])

# Details

|Name|Mr. XYZ|
|---|---|
|Age/Sex|XX YRS/X|
|Id.|01x40xxxxx|
|Refered By|Self|
|Collection On|xx/Aug/20xx 0x:x0AM|
|Collected By|xxxxxxx|
|Sample Rec. On|xx/Aug/20xx xx:x0 AM|
|Collection Mode|HOME COLLECTION|
|Reporting On|xx/Aug/20xx 0x:xx PM|
|BarCode|xxxxxx|

# Test Results

|Test Name|Result|Biological Ref. Int.|Unit|
|---|---|---|---|
|Electrolyte Profile, Serum| | | |
|SODIUM (Na+)|136.2|136 - 145|mmol/L|
|POTASSIUM (K+)|4.23|3.5 - 5.5|mmol/L|
|CHLORIDE(Cl-)|106.24|98.0 - 107|mmol/L|
|TOTAL CALCIUM (Ca)|9.00|8.6-10.2|mg/dL|
|IONIZED CALCIUM|4.52|4.4 - 5.4|mg/dl|
|NON-IONIZED CALCIUM|4.49|4.4 - 5.4|mg/dl|
|pH.(Method : ISE Direct)|7.39|7.35 - 7.45| |

ПРОБЛЕМА: я пробовал несколько способов разделить это на столбцы кадра данных с разделителем |, используя pd.read_csv() и pd.read_table(), но ни один из них не сработал.

import pandas as pd
import io

pd.read_table(doc_parsed[2].text[:1000], sep = "|")

ValueError: неверный путь к файлу или тип объекта буфера: <класс 'llama_index.core.schema.Document'>

import io 

input_text = io.StringIO(print(doc_parsed[2].text[:1000]))

pd.read_csv(input_text,header=None, delimiter = "|", 
            usecols = ["Parameter Name", "Result","Unit","Reference Range"])   

EmptyDataError: нет столбцов для анализа из файла

pd.read_csv(input_text,header=None, delimiter = "|")   

EmptyDataError: нет столбцов для анализа из файла

Ценю любую помощь здесь.

Ваша основная ошибка (которую не учитывают все три текущих ответа ниже) заключается в том, что print возвращает None, а не string, которое он печатает. Итак, первое, что вам нужно сделать, это поменять input_text = io.StringIO(print(doc_parsed[2].text[:1000])) на input_text = io.StringIO(doc_parsed[2].text[:1000]).

ouroboros1 25.08.2024 22:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможное решение:

pd.read_csv(input_text, sep=r'|', engine='python')

Получаю ошибку: EmptyDataError: No columns to parse from file

ViSa 25.08.2024 20:56

На моей стороне он отлично работает с: |Name|Mr. XYZ| |---|---| |Age/Sex|XX YRS/X| |Id.|01x40xxxxx| |Refered By|Self| |Collection On|xx/Aug/20xx 0x:x0AM| |Collected By|xxxxxxx| |Sample Rec. On|xx/Aug/20xx xx:x0 AM| |Collection Mode|HOME COLLECTION| |Reporting On|xx/Aug/20xx 0x:xx PM| |BarCode|xxxxxx|

PaulS 25.08.2024 21:13

Это input_text = io.StringIO(print(doc_parsed[2].text[:1000])) используется? С этим входным текстом pd.read_csv(input_text, sep=r'|', engine='python') он все еще выдает ту же ошибку

ViSa 25.08.2024 21:26

Я думаю, что input_text вы использовали тип string, а для меня doc_parsed[2].text[:1000] - это NoneType, который затем при применении input_text = io.StringIO(sample_text) становится _io.StringIO, но не строковым типом. Так что я все еще сталкиваюсь с проблемами.

ViSa 25.08.2024 21:55

Рад, что кто-то уже нашел решение вашей проблемы!

PaulS 25.08.2024 22:24

Таблицы уценки раздражают, но read_csv должен был сработать, у меня это сработало с вашими данными

table_data = StringIO(markdown_table)
df = pd.read_csv(table_string, sep = "|", skipinitialspace=True, header=0)
df = df.drop(df.columns[[0, -1]], axis=1) #this is extra columns from the markdown conversion
print(df)

header =0 по сути сообщает пандам, что первая строка — это имена ваших столбцов skipinitialspace=True обрежьте строку после разделителя, чтобы получить чистые значения

Я попробовал это input_text = io.StringIO(print(doc_parsed[2].text[:1000])) df = pd.read_csv(input_text, sep = "|", skipinitialspace=True, header=0), но все равно получаю сообщение об ошибке: EmptyDataError: No columns to parse from file

ViSa 25.08.2024 20:55

doc_parsed весь документ? что такое doc_parsed[2], я предполагал, что это список только с таблицами, нет?

Cptmaxon 25.08.2024 21:10

да doc_parsed — это целый документ, так как в этом PDF-файле несколько страниц… кажется, 18. поэтому doc_parsed[2] представляет третью страницу.

ViSa 25.08.2024 21:22

вам необходимо разделить документ и фрагменты строки, содержащие только таблицы уценки. если эти комментарии ограничивают таблицы, просто используйте регулярное выражение # с текстом и новой строкой, например pattern = re.compile(r"(.*?)(#.*?\n)", re.IGNORECASE | re.DOTALL) matches = pattern.findall(text)

Cptmaxon 25.08.2024 21:30

Я думаю, что этот подход будет очень полезен. Попробую этот. Большое спасибо !!!

ViSa 25.08.2024 22:04
Ответ принят как подходящий

Эта проблема может быть связана с неправильным форматированием уценки или с дополнительными символами, с которыми pandas по умолчанию не справляется.

Возможное решение Вы можете попробовать следующий подход:

input_text = io.StringIO(sample_text)

df = pd.read_csv(input_text, sep = "|", skipinitialspace=True)

df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

Используя этот метод, мне удалось успешно проанализировать уценку в DataFrame.

Я надеюсь, что это даст вам чистый DataFrame с вашими данными, красиво организованными в столбцы.

В вашем примере вы использовали текстовые данные partial, так что это работает, но когда я пробую это на всем наборе текста, это не работает. Поэтому, чтобы эта работа работала с полным примером текста, мне пришлось добавить ,skiprows=11 к pd.read_csv(). Большое спасибо за демонстрацию полного кода. Это действительно помогло мне во многом разобраться. Цените вашу помощь.

ViSa 25.08.2024 21:35

С этим все еще есть проблема, поскольку у меня в print(doc_parsed[2].text[:1000]) текст NoneType, а не string. Итак, это работает, когда вы используете это внутри кавычек, а не напрямую из переменной.

ViSa 25.08.2024 21:58

Другие вопросы по теме