文字列からのパンダ Read_csv

Salman Mehmood 2023年6月21日
文字列からのパンダ 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 という名前の関数を作成して、パッケージからデータを取得します。 この操作を実行するには、パッケージの名前とファイルのパスをそれぞれ格納する pkgpath という名前の 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 メソッドは、上記のコードで次の引数を取ります。

  1. io.BytesIO(wells) は、目的のパッケージからフェッチされたデータに対応し、io.BytesIO メソッドを使用してバイト形式で渡され、それをバイトに変換し、ファイルのようなオブジェクトとして渡す必要があります。 read_csvファイルのようなオブジェクト要件のためです。
  2. encoding='utf8' は、入力のテキスト エンコーディングを参照します。これは、渡されたデータのタイプに基づいて異なる値になる可能性があります。
  3. sep=' ' は、データが構成されているセパレータのタイプを示します。 想定される CSV データが最初にどのように作成されたかによって異なる場合があります。
  4. index_col="id" は、データのインデックス列の名前を参照します。 繰り返しますが、これはデータに依存し、ファイルごとに異なる場合があります。
著者: Salman Mehmood
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