Создание фрейма данных Pandas из строки


чтобы проверить некоторые функции, я хотел бы создать DataFrame из строки. Допустим, мои тестовые данные выглядят так:

TESTDATA="""col1;col2;col3
1;4.4;99
2;4.5;200
3;4.7;65
4;3.2;140
"""

каков самый простой способ прочитать эти данные в панд DataFrame?

2 143

2 ответа:

простой способ сделать это-использовать StringIO и передайте это pandas.read_csv

традиционный CSV переменной ширины не читается для хранения данных в виде строковой переменной. Вместо этого рассмотрим данные, разделенные трубами фиксированной ширины. Различные IDE и редакторы могут иметь плагин для форматирования разделенного трубами текста в аккуратную таблицу.

следующие работы для меня. Чтобы использовать его, сохраните его в файл с именем pandas_util.py. Пример включен в строку документа функции. Если вы используете версию 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='|')