Я пытаюсь преобразовать 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, но, думаю, мне не удалось это хорошо объяснить, и она закрылась. Надеюсь, на этот раз я смогу объяснить свою проблему. Это может быть глупая задача, но я уже давно застрял в этом и буду признателен за любую помощь.
🤔 А знаете ли вы, что...
Python был создан Гвидо ван Россумом и впервые выпущен в 1991 году.
Возможное решение:
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