복붙노트

[PYTHON] 문자열에서 팬더 DataFrame 만들기

PYTHON

문자열에서 팬더 DataFrame 만들기

일부 기능을 테스트하기 위해 문자열에서 DataFrame을 만들고 싶습니다. 내 테스트 데이터가 다음과 같다고 가정 해 보겠습니다.

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

그 데이터를 팬더 데이터 프레임으로 읽는 가장 간단한 방법은 무엇입니까?

해결법

  1. ==============================

    1.이 작업을 수행하는 간단한 방법은 StringIO를 사용하여 pandas.read_csv 함수에 전달하는 것입니다. 예 :

    이 작업을 수행하는 간단한 방법은 StringIO를 사용하여 pandas.read_csv 함수에 전달하는 것입니다. 예 :

    import sys
    if sys.version_info[0] < 3: 
        from StringIO import StringIO
    else:
        from io import StringIO
    
    import pandas as pd
    
    TESTDATA = StringIO("""col1;col2;col3
        1;4.4;99
        2;4.5;200
        3;4.7;65
        4;3.2;140
        """)
    
    df = pd.read_csv(TESTDATA, sep=";")
    
  2. ==============================

    2.일반적인 가변 폭 CSV는 데이터를 문자열 변수로 저장하기 위해 읽을 수 없습니다. 고정 너비의 파이프로 구분 된 데이터를 대신 고려하십시오. 다양한 IDE와 편집기에는 파이프로 구분 된 텍스트를 깔끔한 테이블로 포맷하는 플러그인이있을 수 있습니다.

    일반적인 가변 폭 CSV는 데이터를 문자열 변수로 저장하기 위해 읽을 수 없습니다. 고정 너비의 파이프로 구분 된 데이터를 대신 고려하십시오. 다양한 IDE와 편집기에는 파이프로 구분 된 텍스트를 깔끔한 테이블로 포맷하는 플러그인이있을 수 있습니다.

    다음은 나를 위해 일한다. 이를 사용하려면 pandas_util.py라는 파일에 저장하십시오. 예제는 함수의 docstring에 포함되어있다. 3.6 이전의 Python 버전을 사용하는 경우 함수 정의 행에서 유형 주석을 삭제하십시오.

    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='|')
    
  3. from https://stackoverflow.com/questions/22604564/create-pandas-dataframe-from-a-string by cc-by-sa and MIT license