Невозможно преобразовать текст в фрейм данных в 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, но, думаю, мне не удалось это хорошо объяснить, и она закрылась. Надеюсь, на этот раз я смогу объяснить свою проблему. Это может быть глупая задача, но я уже давно застрял в этом и буду признателен за любую помощь.

🤔 А знаете ли вы, что...
Python был создан Гвидо ван Россумом и впервые выпущен в 1991 году.


50
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

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