Я пытаюсь преобразовать text
в dataframe
с помощью Python.
образец_текста: 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'
Окончательный желаемый результат:
Шаги, которые я выполняю для достижения вышеуказанного результата, перечислены ниже:
print()
для обработки этого текста formatted_text = print('This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34')
, но его нельзя назначить, поскольку print()
возвращает NoneType
, поэтому я получаю здесь ошибку.Желаемый результат после этого шага:
This is
sample text
Name|age
--|--
1.abc|45
2.xyz|34
line break text
, хранящееся в variable
для чтения как CSV с разделителем |
, чтобы создать фрейм данных: я думал обработать это как pd.read_csv(formatted_text,sep='|', skipinitialspace=True)
Желаемый_выход после этого шага:
Ранее я пытался объяснить эту проблему в посте SO, но, думаю, мне не удалось это хорошо объяснить, и она закрылась. Надеюсь, на этот раз я смогу объяснить свою проблему. Это может быть глупая задача, но я уже давно застрял в этом и буду признателен за любую помощь.
Разделение на /n
, а затем на |
должно помочь: df = pd.DataFrame([x.split('|') for x in 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'.split('\n')])
Может быть, я чего-то не понимаю?
ваш str
действительно содержит нужный вам результат. Это очень важно понять. Вы можете проверить print('This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34')
самостоятельно
@ScottHunter эта проблема на самом деле основана на результатах marked down
файла, который был сгенерирован после анализа PDF-файла с использованием модели AI.
Откуда поступила информация, не имеет отношения к тому, что задают, о чем свидетельствует то, что вы не включили ее в вопрос.
Обратите внимание, проблема здесь в том, что pandas
не принимает строки для анализа в формате csv, вам нужно обернуть i в io.StringIO
Возможное решение:
text = 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'
pd.read_csv(StringIO(text), lineterminator='\n', engine='c', header=None)
Выход:
0
0 This is
1 sample text
2 Name|age
3 --|--
4 1.abc|45
5 2.xyz|34
Чтобы разделить столбцы, мы можем использовать str.split после read_csv:
(pd.read_csv(StringIO(text), lineterminator='\n', engine='c', header=None)[0]
.str.split('|', expand=True))
Выход:
0 1
0 This is None
1 sample text None
2 Name age
3 -- --
4 1.abc 45
5 2.xyz 34
Большое спасибо, Павел С. Это все, что я хотел и не знал, что это так просто. Застрял в этом уже давно. Действительно очень ценю вашу помощь. Мне потребовалось 3 сообщения SO, чтобы прийти к этому окончательному решению. Действительно ценю это. Приму ваш ответ, как только мне это позволит.
Нужно использовать sep='|'
Спасибо, @juanpa.arrivillaga! Да, я это упустил из виду. Однако sep = '|'
, похоже, не работает — выдает ошибку. Мне все еще нужно это проверить.
Я не думаю, что вы можете использовать read_csv
здесь, здесь нет постоянного количества полей.
@mozway да, хорошая мысль, я просто указал, что конечные предполагаемые поля были разделены трубкой
Спасибо, @mozway. Правда, мы не можем использовать read_csv
для разделения столбцов, но можно разделить столбцы после использования read_csv
, как показывает мое второе решение.
Вы можете просто разделить строки, затем столбцы и передать это конструктору DataFrame , дополнительно fillna с помощью ''
:
s = 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'
df = pd.DataFrame([x.split('|') for x in s.split('\n')]).fillna('')
В качестве альтернативы можно использовать Series и str.split:
df = pd.Series(s.splitlines()).str.split('|', expand=True).fillna('')
Выход:
0 1
0 This is
1 sample text
2
3 Name age
4 -- --
5 1.abc 45
6 2.xyz 34
Мы можем разделить каждую строку по |
на список и создать из него фрейм данных:
import pandas as pd
text = 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'
array = [line.split('|') if '|' in line else [line, ''] for line in text.splitlines()]
df = pd.DataFrame(array)
print(df)
выход:
0 1
0 This is
1 sample text
2
3 Name age
4 -- --
5 1.abc 45
6 2.xyz 34
Почему это отмечено
pdf-parsing
?