文字列からのパンダ Read_csv
この記事の主な目的は、Python で Pandas を使用して、文字列またはパッケージ データから CSV テキスト データを読み取る方法を示すことです。
Python Pandas read_csv
From String
問題
データは複数の形式で保存できます。 主な形式のうち 2つは、構造化されたものと構造化されていないものとして定義されています。 これらの主要な形式は、さらに多くの形式に分割できます。CSV (コンマ区切り値) はその 1つです。
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
という名前の 2つのメソッドが必要です。
get_data_file
の戻り値は、read_csv
メソッドに渡されてデータが読み取られますが、出力に見られるように、CParserError
タイプのエラーが返され、Passed header=0 but only 0 lines. ファイル
.
ソリューション
この問題の解決策は、要件に基づいて 2つの異なる方法でアプローチできます。
アプローチ 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