문자열에서 Pandas Read_csv

Salman Mehmood 2023년6월21일
문자열에서 Pandas Read_csv

이 기사의 주요 목표는 Python에서 Pandas를 사용하여 문자열 또는 패키지 데이터에서 CSV 텍스트 데이터를 읽는 방법을 보여주는 것입니다.

Python Pandas read_csv 문자열에서

문제

데이터는 여러 형태로 저장될 수 있습니다. 두 가지 주요 형식은 구조화 및 비구조화로 정의됩니다. 이러한 기본 형식은 여러 형식으로 더 나눌 수 있으며 CSV(쉼표로 구분된 값)가 그 중 하나입니다.

CSV 파일에서 데이터를 읽는 동안 복잡한 쿼리나 처리를 위해 상황에 따라 문자열이나 특정 패키지에서 데이터를 읽어야 할 수도 있습니다.

다음 코드를 고려하십시오.

import pandas as pd

import pkgutil
from io import StringIO


def get_data_file(pkg, path):
    f = StringIO()
    contents = unicode(pkgutil.get_data("pymc.examples", "data/wells.dat"))
    f.write(contents)
    return f


wells = get_data_file("pymc.examples", "data/wells.dat")

data = pd.read_csv(wells, delimiter=" ", index_col="id", dtype={"switch": np.int8})

출력:

 File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 401, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 209, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 509, in __init__
    self._make_engine(self.engine)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 611, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 893, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "parser.pyx", line 441, in pandas._parser.TextReader.__cinit__ (pandas/src/parser.c:3940)
  File "parser.pyx", line 551, in pandas._parser.TextReader._get_header (pandas/src/parser.c:5096)
pandas._parser.CParserError: Passed header=0 but only 0 lines in file

다음 코드에서는 패키지에서 데이터를 가져오기 위해 get_data_file이라는 함수가 생성됩니다. 이 작업을 수행하려면 각각 패키지 이름과 파일 경로를 저장하는 pkgpath라는 두 가지 메서드를 사용합니다.

반환된 get_data_file 값은 데이터를 읽기 위해 read_csv 메서드로 전달되지만 출력에서 볼 수 있듯이 Passed header=0 but only 0 lines 설명과 함께 CParserError 유형의 오류가 반환됩니다. 파일.

해결책

이 문제에 대한 해결책은 요구 사항에 따라 두 가지 다른 방식으로 접근할 수 있습니다.

접근법 1 - io.StringIO가 있는 문자열의 경우

다음 코드를 고려하십시오.

import pandas as pd

from io import StringIO

df = pd.read_csv(
    StringIO(
        "id,switch, arsenic, dist, assoc, educ\n"
        "1, 2.36, 16.826000, 0, 0, 0\n"
        "2, 1, 0.71, 47.321999, 0, 0\n"
        "3, 0, 2.07, 20.966999, 0, 10\n"
        "4, 1, 1.15, 21.486000, 0, 12\n"
        "5, 1, 1.10, 40.874001, 1, 14\n"
        "6, 2, 1.22, 23.123131, 1, 23\n"
        "7, 5, 5.33, 29.232322, 0, 38\n"
        "8, 1, 2.38, 90.222221, 1, 10\n"
        "9, 9, 2.01, 10.222334, 0, 0\n"
        "10, 0, 9.12, 20.324252, 0, 10\n"
    ),
    index_col=0,
)

print(df)

출력:

    switch   arsenic       dist   assoc   educ
id
1     2.36    16.826   0.000000       0      0
2     1.00     0.710  47.321999       0      0
3     0.00     2.070  20.966999       0     10
4     1.00     1.150  21.486000       0     12
5     1.00     1.100  40.874001       1     14
6     2.00     1.220  23.123131       1     23
7     5.00     5.330  29.232322       0     38
8     1.00     2.380  90.222221       1     10
9     9.00     2.010  10.222334       0      0
10    0.00     9.120  20.324252       0     10

StringIO 모듈을 사용하면 read_csv 메서드에 문자열을 전달하여 문자열에서 CSV 텍스트 데이터를 읽을 수 있습니다.

StringIO 모듈은 일반적으로 “파일과 같은” 개체가 필요한 메서드를 실행하는 데 도움이 됩니다. 생성자에 문자열을 전달하여 “파일과 같은” 개체를 필요로 하는 메서드에 전달할 수 있는 “파일과 같은” 개체를 만듭니다.

Python 2.7에서 StringIO 모듈은 StringIO로 정의되었지만 Python 3+에서는 io.StringIO로 변경되었습니다.

코드가 유연해야 하고 Python2와 Python3 모두에서 실행되도록 대상이 되는 경우를 처리하려면 적절한 구현을 구현해야 합니다.

접근법 2 - io.BytesIO가 포함된 패키지의 경우

다음 코드를 고려하십시오.

import numpy as np
import pandas as pd
import io
import pkgutil

wells = pkgutil.get_data("pymc.examples", "data/wells.dat")
print("Data Type: ", str(type(wells)))

df = pd.read_csv(
    io.BytesIO(wells),
    encoding="utf8",
    sep=" ",
    index_col="id",
    dtype={"switch": np.int8},
)
print(df.head())

출력:

Data Type: <class 'bytes'>
    switch  arsenic       dist  assoc  educ
id
1        1     2.36  16.826000      0     0
2        1     0.71  47.321999      0     0
3        0     2.07  20.966999      0    10
4        1     1.15  21.486000      0    12
5        1     1.10  40.874001      1    14

패키지에서 CSV 데이터를 읽는 경우 먼저 pkgutil.get_data 메서드를 사용하여 데이터를 가져온 다음 가져온 데이터에서 CSV 데이터를 읽으려면 read_csv 메서드를 사용할 수 있습니다.

pkgutil.get_data 메서드에서 가져온 데이터를 전달하려면 io.BytesIO 메서드를 사용해야 한다는 점에 유의해야 합니다. 그리고 우리의 경우 utf8인 데이터 인코딩을 언급합니다.

구분 기호는 sep 인수를 사용하여 정의되며 인덱스 열은 index_col 인수를 사용하여 표시되어야 합니다.

대체로 read_csv 메서드는 위에서 언급한 코드에서 다음 인수를 사용합니다.

  1. io.BytesIO(wells)는 원하는 패키지에서 가져온 데이터에 해당하며 io.BytesIO 메서드를 사용하여 바이트 형식으로 전달하여 바이트로 변환하고 “파일과 같은” 객체로 전달해야 합니다. read_csv의 “파일과 같은” 개체 요구 사항으로 인해.
  2. encoding='utf8'은 입력의 텍스트 인코딩을 나타내며 전달된 데이터 유형에 따라 다른 값이 될 수 있습니다.
  3. sep=' '는 데이터를 구성하는 구분 기호 유형을 나타냅니다. 가정된 CSV 데이터가 애초에 어떻게 생성되었는지에 따라 다를 수 있습니다.
  4. index_col="id"는 데이터의 인덱스 열 이름을 나타냅니다. 다시 말하지만 데이터에 따라 다르며 파일마다 다를 수 있습니다.
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

관련 문장 - Pandas CSV