문자열에서 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
이라는 함수가 생성됩니다. 이 작업을 수행하려면 각각 패키지 이름과 파일 경로를 저장하는 pkg
및 path
라는 두 가지 메서드를 사용합니다.
반환된 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
메서드는 위에서 언급한 코드에서 다음 인수를 사용합니다.
io.BytesIO(wells)
는 원하는 패키지에서 가져온 데이터에 해당하며io.BytesIO
메서드를 사용하여 바이트 형식으로 전달하여 바이트로 변환하고 “파일과 같은” 객체로 전달해야 합니다.read_csv
의 “파일과 같은” 개체 요구 사항으로 인해.encoding='utf8'
은 입력의 텍스트 인코딩을 나타내며 전달된 데이터 유형에 따라 다른 값이 될 수 있습니다.sep=' '
는 데이터를 구성하는 구분 기호 유형을 나타냅니다. 가정된 CSV 데이터가 애초에 어떻게 생성되었는지에 따라 다를 수 있습니다.index_col="id"
는 데이터의 인덱스 열 이름을 나타냅니다. 다시 말하지만 데이터에 따라 다르며 파일마다 다를 수 있습니다.
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