Невозможно преобразовать текст в фрейм данных в Python

Я пытаюсь преобразовать text в dataframe с помощью Python.

образец_текста: 'This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34'

Окончательный желаемый результат:

Шаги, которые я выполняю для достижения вышеуказанного результата, перечислены ниже:

  1. Разбейте текст на несколько строк и присвойте его переменной: я пробовал использовать 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
  1. Используйте приведенное выше line break text, хранящееся в variable для чтения как CSV с разделителем |, чтобы создать фрейм данных: я думал обработать это как pd.read_csv(formatted_text,sep='|', skipinitialspace=True)

Желаемый_выход после этого шага:

Ранее я пытался объяснить эту проблему в посте SO, но, думаю, мне не удалось это хорошо объяснить, и она закрылась. Надеюсь, на этот раз я смогу объяснить свою проблему. Это может быть глупая задача, но я уже давно застрял в этом и буду признателен за любую помощь.

Почему это отмечено pdf-parsing?

Scott Hunter 27.08.2024 19:45

Разделение на /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')]) Может быть, я чего-то не понимаю?

JNevill 27.08.2024 19:45

ваш str действительно содержит нужный вам результат. Это очень важно понять. Вы можете проверить print('This is \nsample text\n\nName|age\n--|--\n1.abc|45\n2.xyz|34') самостоятельно

juanpa.arrivillaga 27.08.2024 19:47

@ScottHunter эта проблема на самом деле основана на результатах marked down файла, который был сгенерирован после анализа PDF-файла с использованием модели AI.

ViSa 27.08.2024 19:47

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

Scott Hunter 27.08.2024 19:48

Обратите внимание, проблема здесь в том, что pandas не принимает строки для анализа в формате csv, вам нужно обернуть i в io.StringIO

juanpa.arrivillaga 27.08.2024 19:51
Почему в 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
6
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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, чтобы прийти к этому окончательному решению. Действительно ценю это. Приму ваш ответ, как только мне это позволит.

ViSa 27.08.2024 19:51

Нужно использовать sep='|'

juanpa.arrivillaga 27.08.2024 19:51

Спасибо, @juanpa.arrivillaga! Да, я это упустил из виду. Однако sep = '|', похоже, не работает — выдает ошибку. Мне все еще нужно это проверить.

PaulS 27.08.2024 19:55

Я не думаю, что вы можете использовать read_csv здесь, здесь нет постоянного количества полей.

mozway 27.08.2024 19:56

@mozway да, хорошая мысль, я просто указал, что конечные предполагаемые поля были разделены трубкой

juanpa.arrivillaga 27.08.2024 19:57

Спасибо, @mozway. Правда, мы не можем использовать read_csv для разделения столбцов, но можно разделить столбцы после использования read_csv, как показывает мое второе решение.

PaulS 27.08.2024 20:00

Вы можете просто разделить строки, затем столбцы и передать это конструктору 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

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