Создание фрейма данных Pandas из строки
чтобы проверить некоторые функции, я хотел бы создать DataFrame
из строки. Допустим, мои тестовые данные выглядят так:
TESTDATA="""col1;col2;col3
1;4.4;99
2;4.5;200
3;4.7;65
4;3.2;140
"""
каков самый простой способ прочитать эти данные в панд DataFrame
?
2 ответов
простой способ сделать это-использовать StringIO
и передайте это pandas.read_csv
традиционный CSV переменной ширины нечитаем для хранения данных в виде строковой переменной. Вместо этого рассмотрим данные, разделенные трубами фиксированной ширины. Различные IDEs и редакторы могут иметь плагин для форматирования разделенного трубой текста в аккуратную таблицу.
для меня работает следующее. Чтобы использовать его, сохраните его в файле с именем pandas_util.py
. Пример включен в docstring функции. Если вы используете версию Python старше 3.6, удалить Примечания из определения функции линия.
import re
import pandas as pd
def read_pipe_separated_str(str_input: str) -> pd.DataFrame:
"""Read a Pandas object from a pipe-separated table contained within a string.
Example:
| int_score | ext_score | eligible |
| | 701 | True |
| 221.3 | 0 | False |
| | 576 | True |
| 300 | 600 | True |
The leading and trailing pipes are optional, but if one is present, so must be the other.
In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can be used to neatly format a table.
"""
substitutions = [
('^ *', ''), # Remove leading spaces
(' *$', ''), # Remove trailing spaces
(r' *\| *', '|'), # Remove spaces between columns
]
if all(line.lstrip().startswith('|') and line.rstrip().endswith('|') for line in str_input.strip().split('\n')):
substitutions.extend([
(r'^\|', ''), # Remove redundant leading delimiter
(r'\|$', ''), # Remove redundant trailing delimiter
])
for pattern, replacement in substitutions:
str_input = re.sub(pattern, replacement, str_input, flags=re.MULTILINE)
return pd.read_csv(pd.compat.StringIO(str_input), sep='|')