Я проанализировал 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: нет столбцов для анализа из файла
Ценю любую помощь здесь.
Возможное решение:
pd.read_csv(input_text, sep=r'|', engine='python')
Получаю ошибку: EmptyDataError: No columns to parse from file
На моей стороне он отлично работает с: |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|
Это input_text = io.StringIO(print(doc_parsed[2].text[:1000]))
используется? С этим входным текстом pd.read_csv(input_text, sep=r'|', engine='python')
он все еще выдает ту же ошибку
Я думаю, что input_text
вы использовали тип string
, а для меня doc_parsed[2].text[:1000]
- это NoneType
, который затем при применении input_text = io.StringIO(sample_text)
становится _io.StringIO
, но не строковым типом. Так что я все еще сталкиваюсь с проблемами.
Рад, что кто-то уже нашел решение вашей проблемы!
Таблицы уценки раздражают, но 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
doc_parsed весь документ? что такое doc_parsed[2], я предполагал, что это список только с таблицами, нет?
да doc_parsed
— это целый документ, так как в этом PDF-файле несколько страниц… кажется, 18. поэтому doc_parsed[2] представляет третью страницу.
вам необходимо разделить документ и фрагменты строки, содержащие только таблицы уценки. если эти комментарии ограничивают таблицы, просто используйте регулярное выражение # с текстом и новой строкой, например pattern = re.compile(r"(.*?)(#.*?\n)", re.IGNORECASE | re.DOTALL) matches = pattern.findall(text)
Я думаю, что этот подход будет очень полезен. Попробую этот. Большое спасибо !!!
Эта проблема может быть связана с неправильным форматированием уценки или с дополнительными символами, с которыми 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()
. Большое спасибо за демонстрацию полного кода. Это действительно помогло мне во многом разобраться. Цените вашу помощь.
С этим все еще есть проблема, поскольку у меня в print(doc_parsed[2].text[:1000])
текст NoneType
, а не string
. Итак, это работает, когда вы используете это внутри кавычек, а не напрямую из переменной.
Ваша основная ошибка (которую не учитывают все три текущих ответа ниже) заключается в том, что
print
возвращаетNone
, а неstring
, которое он печатает. Итак, первое, что вам нужно сделать, это поменятьinput_text = io.StringIO(print(doc_parsed[2].text[:1000]))
наinput_text = io.StringIO(doc_parsed[2].text[:1000])
.