문자열에서 Pandas DataFrame 만들기


276

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

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

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

답변:


497

이를 수행하는 간단한 방법은 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=";")

7
Python 2 및 3과 호환되는 코드가 필요한 경우 Python과 함께 제공되는 from pandas.compat import StringIO클래스와 동일한 클래스라는 점에 유의하여을 사용할 수도 있습니다 .
Acumenus

3
참고로- pd.read_table()동등한 기능이며 약간 더 나은 명명법 df = pd.read_table(TESTDATA, sep=";")입니다.
wkzhu December

5
@AntonvBR 하나를 사용할 수 있습니다 pandas.compat.StringIO. 그렇게하면 StringIO별도로 가져올 필요가 없습니다 . 그러나 pandas.pydata.org/pandas-docs/stable/api.html?highlight=compatpandas.compat 에 따르면 패키지는 비공개로 간주 되므로 지금과 같이 대답을 남겨 두십시오 .
Emil H


당신과 함께 TestData 사용을 작성하는 경우 df.to_csv(TESTDATA), 사용TESTDATA.seek(0)
user3226167

18

분할 방법

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

2
첫 번째 행을 열 이름으로 사용하려면 두 번째 행을 다음과 같이 변경하십시오.df = pd.DataFrame([x.split(';') for x in data.split('\n')[1:]], columns=[x for x in data.split('\n')[0].split(';')])
Mabyn

1
CSV 파일에서 줄 바꾸기 (\ n) 문자가 필드의 일부일 수 있기 때문에 이것은 잘못된 것입니다.
Antonio Ercole De Luca

이것은 매우 강력하지는 않으며 대부분의 사람들이 받아 들여진 대답으로 더 나을 것입니다. thomasburette.com/blog/2014/05/25/
DanB

10

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

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

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

2
재현성은 좋지 않지만 그렇지 않으면 깔끔한 솔루션입니다!
Mabyn

5

기존 가변 너비 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받아 사용합니다. 따라서 파이프로 분리 된 데이터에는 전혀 사용하지 않아야합니다.


1
나는 (시험 및 오류에 의해) 문서화 된 것보다 read_fwf더 많은 read_csv논증 을 취하는 것을 발견 했지만 일부는 효과가 없다는 것이 사실입니다 .
gerrit

-4

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

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 파일을 어떻게 만들 수 있습니까?


파일을 만들 권한이 없으면 어떻게합니까?
BingLi224

제 생각에는 더 이상 가장 간단한 경우는 아닙니다. "가장 간단한"이 질문에 명시 적으로 언급되어 있습니다.
QtRoS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.