[python] 문자열에서 Pandas DataFrame 만들기

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

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

해당 데이터를 Pandas로 읽는 가장 간단한 방법은 무엇입니까 DataFrame?



답변

이를 수행하는 간단한 방법은 StringIO.StringIO(python2) 또는 io.StringIO(python3) 을 사용하여 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=";")


답변

분할 방법

data = input_string
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
print(df)


답변

대화식 작업을위한 빠르고 쉬운 솔루션은 클립 보드에서 데이터를로드하여 텍스트를 복사하여 붙여 넣는 것입니다.

마우스로 문자열의 내용을 선택하십시오.

Pandas 데이터 프레임에 붙여 넣기 위해 데이터 복사

파이썬 셸에서 read_clipboard()

>>> pd.read_clipboard()
  col1;col2;col3
0       1;4.4;99
1      2;4.5;200
2       3;4.7;65
3      4;3.2;140

적절한 구분 기호를 사용하십시오.

>>> pd.read_clipboard(sep=';')
   col1  col2  col3
0     1   4.4    99
1     2   4.5   200
2     3   4.7    65
3     4   3.2   140

>>> df = pd.read_clipboard(sep=';') # save to dataframe


답변

기존 가변 너비 CSV는 데이터를 문자열 변수로 저장하기 위해 읽을 수 없습니다. 특히 .py파일 내부에서 사용하는 경우 고정 너비의 파이프 분리 데이터를 대신 고려하십시오. 다양한 IDE 및 편집기에는 파이프로 구분 된 텍스트를 깔끔한 테이블로 형식화하는 플러그인이있을 수 있습니다.

사용 read_csv

다음과 같은 유틸리티 모듈에 다음을 저장하십시오 util/pandas.py. 함수의 docstring에 예제가 포함되어 있습니다.

import io
import re

import pandas as pd


def read_psv(str_input: str, **kwargs) -> pd.DataFrame:
    """Read a Pandas object from a pipe-separated table contained within a string.

    Input 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.

    `kwargs` are passed to `read_csv`. They must not include `sep`.

    In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can
    be used to neatly format a table.

    Ref: https://stackoverflow.com/a/46471952/
    """

    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(io.StringIO(str_input), sep='|', **kwargs)

작동하지 않는 대안

아래 코드는 왼쪽과 오른쪽에 빈 열을 추가하기 때문에 제대로 작동하지 않습니다.

df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')

에 관해서는 read_fwf, 그것은 실제로 사용하지 않는 옵션 kwargs로의 많은 read_csv받아 사용합니다. 따라서 파이프로 분리 된 데이터에는 전혀 사용하지 않아야합니다.


답변

가장 간단한 방법은 임시 파일로 저장 한 다음 읽는 것입니다.

import pandas as pd

CSV_FILE_NAME = 'temp_file.csv'  # Consider creating temp file, look URL below
with open(CSV_FILE_NAME, 'w') as outfile:
    outfile.write(TESTDATA)
df = pd.read_csv(CSV_FILE_NAME, sep=';')

임시 파일을 만드는 올바른 방법 : 파이썬에서 tmp 파일을 어떻게 만들 수 있습니까?


답변