Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。07:00Pythonデータ処理ポスト機械学習やデータ分析には、収集したデータを使いやすい形に整える前処理が不可欠です。その際によく利用されるのがPythonのライブラリ「pandas」。今回は『現場で使える!pandasデータ前処理入門』(翔泳社)より、pandasの最も基本的なデータ構造であるシリーズの概要と操作方法について抜粋して紹介します。シリーズ」を抜粋したものです。掲載にあたり一部を編集しています。シリーズの概要シリーズはインデックス付けされた複数のデータ型(int、str、float等)を持つことが可能な1次元配列のオブジェクトです。インデックスとはデータに対して付与されるラベルです。データの参照や様々な処理で使われます。インデックスには数値や文字列を使うことが可能で、重複した値を指定することもできます。1次元の配列オブジェクトと言われてもイメージがつきにくいですが、シリーズは図2.1のようにインデックスと1列のデータで構成されます。データ参照や処理を行うため、インデックス(つまりラベル)が各データに対して必ず付与されます。pandasのシリーズシリーズの生成シリーズはSeriesクラスのコンストラクタで作成することが可能です。Pythonのリストやディクショナリから作成することができます。height(身長)のデータをPythonのリストに格納して、Seriesコンストラクタを使ってシリーズを作ってみましょう。シリーズオブジェクトには初期設定で0から始まるインデックスラベルが、RangeIndexクラスにより付与されます(リスト2.1)。int64シリーズはNumPy配列からも作成が可能です。weight(体重)のデータをNumPy配列として作成して、シリーズを生成してみましょう。リスト2.2では、リスト2.1と同様に0から始まる公差1の等差数列がインデックスラベルとして付与されており、各値はweight_arrの値となります。int64シリーズにはオプションでname属性を付与することが可能です。name属性はシリーズをデータフレームと連結する時などに使われます。コンストラクタのname引数に文字列を渡してname属性を指定してみましょう(リスト2.3)。int64コンストラクタのindex引数を使ってインデックスラベルを指定することが可能です。インデックスラベルは重複した値を指定することも可能ですが、必ずシリーズオブジェクトと同じ長さでなくてはいけません。リスト2.4のシリーズserのインデックスの値(変数labels)は重複した文字列が含まれますが、問題なくシリーズが生成されています。int64シリーズのインデックスラベルはシリーズオブジェクトのindex属性で確認できます。リスト2.4でindex引数へ指定した値を持つIndexオブジェクトが戻されます(リスト2.5)。Indexオブジェクトの詳細は2.3節で解説します。dtype='object')Pythonのディクショナリからもシリーズを生成することが可能です。コンストラクタのindex引数へ指定がない場合、ディクショナリのキーがインデックス、バリューがシリーズの要素の値になります(リスト2.6)。0.23以降でディクショナリのキーを使ってシリーズを作成した場合、シリーズの順序はディクショナリの順序通りとなります。それ以前のバージョンの場合はキーの値に応じて辞書順へ自動的に並べ替えられます。ディクショナリによるシリーズ生成の際にindex引数を指定すると、index引数へ指定したインデックスラベルの値に応じてディクショナリのバリューの値が引き出されます。変数dicのキーは文字列a、b、cです。キーに含まれない「d」をindex引数に追加してシリーズを作成してみましょう。リスト2.7では、作成されたシリーズは変数dicのキーとindex引数の値に対応して要素の値が代入されます。変数dicのキーにdは含まれないので、シリーズのインデックスラベルdの要素は値の欠落を示す欠損値(NaN)となります。member)が欠損値を表すのに使われます。欠損値の詳細は6.1節で詳しく解説します。スカラー値からもシリーズを作成することが可能ですが、必ずindex引数を指定する必要があります。リスト2.8のように指定されたインデックスラベルの値に準じてスカラー値が代入されます。詳しいインデックス参照の操作方法は3.1節で解説します。この章ではシリーズの初歩的なインデックス参照の方法を確認していきましょう。pandasのシリーズはNumPy配列と多くの部分で類似しています。リスト2.9ではインデックス参照の動作を確認するため、値に1~5の整数を持ち、インデックスラベルに「あ~お」の文字列を持つシリーズをコンストラクタを使って生成しています。]を使ってシリーズのインデックス参照をしてみましょう。シリーズオブジェクトで角括弧を使った場合、シリーズのインデックスラベルによる参照が行われます。ser['あ']はシリーズserのインデックスラベルの値が「あ」の要素を参照します(リスト2.10)。角括弧によるインデックス参照inser['あ']out1シリーズオブジェクトもPythonのシーケンスと同様にスライスによるインデックス参照が可能です。ser['あ':'え']と表記した場合、インデックスラベル「あ」から「え」までのインデックスの参照を行います(リスト2.11)。インデックスラベルを使ったスライスによるインデックス参照は始点と終点の両方が含まれます。Pythonのリストでスライスによるインデックス参照を行った場合は終点は含まれません。スライスによるインデックス参照の解説は3.1.2項を参照してください。int64シリーズはインデックスラベルに加えて、整数の位置インデックスでの参照も可能です。シリーズserのインデックスラベルは文字列「あいうえお」ですが、シリーズの要素の位置を指定して参照することが可能です。位置インデックスは0から始まる公差1の等差数列の整数です。位置インデックスによる参照を行う場合はiloc属性を使います。インデックスラベル「あ」の位置インデックスは「0」ですので、ser['あ']とser.iloc[0]が参照する値は同等になります(リスト2.12)。インデックスラベルと位置インデックスinprint(ser['あ'])print(ser.iloc[0])out11角括弧を使いシリーズの各要素の値に基づいてインデックス参照を行うことも可能です。比較演算子を使いシリーズserの要素が3より大きい要素のインデックス参照を行ってみましょう(リスト2.13)。シリーズの値が4と5の要素が参照されているのが確認できます。int64シリーズの演算シリーズオブジェクトの初歩的な演算操作について確認していきましょう。シリーズserの各要素の値に対して整数2を加算する処理を行ってみます。シリーズはNumPy配列と同じく要素毎に反復処理を行う必要はありません。算術演算子を使ってシリーズの各要素の処理を行うことが可能です。2を実行してシリーズの各要素に2を加算してみましょう(リスト2.14)。int64参考までにですが、Pythonのリストで演算子+は要素の連結を行いますのでシリーズとの動作が大きく異なります。[2]を実行してみましょう(リスト2.15)。Pythonのリストを保持するmylistの最後の要素に整数2が連結されているのを確認できます。2]Pythonのリストの各要素に2を加算する場合はfor文を使って各要素毎に加算の処理を行う必要があります。for文を使いリストmylistの各要素へ演算子+=を使い2を加算してみましょう(リスト2.16)。シリーズオブジェクトは演算子+で各要素への加算を行うことができますので、Pythonのリストと動作が異なります。7]他にも乗算や除算などの演算もpandasのシリーズでは各要素に対して一度に処理を加えることが可能です。それぞれ演算子を使い動作を確認してみましょう(リスト2.17)。float64シリーズオブジェクト同士の演算ではインデックスラベルの値に基づいて処理が行われます。2つのシリーズオブジェクトの演算はインデックスラベル毎に自動的に調整して処理されます。シリーズserのインデックスラベルは「あいうえお」なのに対し、リスト2.18のシリーズser2のインデックスラベルは「あいうえか」です。ser2とした結果、ser3のインデックスラベルは両方のシリーズのインデックスラベルの和集合(少なくともどちらか一方の集合に属する要素全体の集合)となります。両シリーズに対応するインデックスラベルの箇所は各要素の加算された値が戻されますが、インデックスラベルの対応がない箇所は欠損値(NaN)が代入されます。オブジェクトはこのようにラベルと要素が紐付いており、原則的にラベルと要素を1つの対として扱います。この原則により、多くのデータ処理を柔軟かつ効率的に行えるメリットがあります。シリーズの基本操作シリーズオブジェクトはpandasの最も基本的なデータ構造であり、データ分析の現場ではシリーズを扱うことは多々あります。この項ではシリーズオブジェクトの基本的な属性(Attributes)とメソッド(Methods)を解説します。データフレーム(2.2節で詳しく解説します)とシリーズの属性、メソッドは共通で使えるものが多数あります。すべての属性・メソッドを覚えておく必要はありませんが、使用頻度の高い初歩的なものは覚えておくとよいでしょう。シリーズの属性シリーズオブジェクトのインデックスラベルを確認するindex属性を確認してみましょう。index属性はシリーズのIndexオブジェクトを戻します。Indexオブジェクトには様々な種類があります。コンストラクタのindex引数を指定しない場合は初期値のRangeIndex、整数を指定した場合はInt64Index、文字列はIndexになります。それぞれ異なるインデックスラベルを持つシリーズをコンストラクタに指定して、index属性で各シリーズのインデックスを確認してみましょう(リスト2.19)。Indexオブジェクトについては2.3節で詳しく解説します。dtype='object')dtype属性ではシリーズの要素のデータ型を確認することができます。それぞれ異なるデータ型の値を用いてdtype属性を確認してみます。シリーズは複数のデータ型を格納することが可能ですが、その場合のデータ型は「object」となります(リスト2.20)。]以外にも、loc属性とiloc属性で参照することが可能です。iloc属性は位置インデックスの値を使って参照を行います。対して、loc属性はインデックスラベルによるインデックス参照を行います。loc属性、iloc属性共にスライスも対応しています。2つの異なるインデックスラベルを持つシリーズを作成して確認してみましょう(リスト2.21)。シリーズaは整数1~3、シリーズbは文字列a~cのインデックスラベルを指定します。int64loc属性はインデックスラベルの値でデータの参照を行います。シリーズaのラベル「1」、シリーズbのラベル「a」を指定してインデックス参照をしてみましょう。それぞれ各インデックスラベルに該当する要素の値「1」を戻します(リスト2.22)。シリーズのloc属性を使ったインデックス参照inprint(a.loc[1])print(b.loc['a'])out11iloc属性は整数による位置インデックスで要素の参照を行います。シリーズaとbの位置インデックス0のデータを参照してみましょう(リスト2.23)。シリーズのiloc属性を使ったインデックス参照inprint(a.iloc[0])print(b.iloc[0])out11iloc属性、loc属性共にスライスに対応しています。終点の扱いが異なるので注意が必要です。loc属性は終点を含みますが、iloc属性は終点は含まれません。ややこしいですが、正しく覚えておきましょう(リスト2.24)。int64シリーズの他の属性も確認してみましょう。シリーズに含まれる要素の数を確認する場合はsize属性が便利です。size属性はあくまでシリーズに含まれる要素の数を確認するための属性です。値が重複していても関係ありません。重複した値を持つシリーズを作成してsize属性を確認してみましょう(リスト2.25)。pd.Series([1,1,3,4,'a'])print(ser.size)out5シリーズの要素の重複の可否を確認する際はis_unique属性を使用します。is_unique属性はシリーズの値に重複がなければTrue、重複があればFalseを戻します。一意の値を持つシリーズaと重複した値を持つシリーズbを作成してis_unique属性で確認してみましょう(リスト2.26)。pd.Series([1,1,3])print(a.is_unique)print(b.is_unique)outTrueFalse機械学習フレームワークを用いてモデリングを行う際などに、pandasのシリーズの要素をNumPy配列として扱いたいケースもあります。values属性はシリーズをNumPy配列で戻します。シリーズに含まれるデータ型がpandas特有のcategory型の場合、NumPy配列となりませんので注意が必要です。文字列と数値を持つシリーズaとbに加えて、category型の値を持つシリーズcを作成して確認してみましょう。シリーズのコンストラクタのdtype引数でシリーズの要素のデータ型を指定することが可能です(リスト2.27)。b]要素の変更と追加シリーズの要素の値の変更を行いましょう。値の変更は変更したい箇所のインデックスを参照して値を代入します。スライスを使って複数要素の変更も可能です。要素の値が1~5、インデックスラベルにa~eを持つシリーズを作成しましょう(リスト2.28)。int64ここで、シリーズserのインデックスラベルaの値を1から6へ変更します。スライスを使ってインデックスラベルb~dの要素を7へ変更してみましょう(リスト2.29)。int64要素の追加は既存のシリーズに含まれていないインデックスラベルと値を指定することで可能です。シリーズserのインデックスラベルはa~eまでのアルファベットの文字列です。現在シリーズのインデックスラベルに含まれていないインデックスラベル「あ」を角括弧に指定して値4を追加してみましょう(リスト2.30)。int64シリーズオブジェクトのappendメソッドを使って異なるシリーズを連結することも可能です。値5、6を持ちインデックスラベル「い」「う」を持つシリーズser2を作成して、appendメソッドでシリーズserと連結をしてみましょう(リスト2.31)。int64appendメソッドのignore_index引数(初期値False)を使うことで、連結したシリーズのインデックスラベルを新しく振り直すことも可能です。クスラベルとして使われました。ignore_index引数へTrueを指定して新しくインデックスラベルを振り直してみましょう(リスト2.32)。int64要素の排除シリーズの要素の削除を行うには複数の方法があります。Pythonのdel文を使ってシリーズの要素を削除してみましょう。値1~3、インデックスラベルa~cを持つシリーズを作成して、インデックスラベルaの要素をdel文を使いシリーズから削除してみます(リスト2.33)。int64シリーズオブジェクトのdropメソッドでも要素の削除が可能です。引数(初期値False)をTrueとすることでシリーズを直接変更することが可能です。dropメソッドを使って削除してみましょう(リスト2.34)。int64重複した値データ分析では重複した値の処理を行う必要がしばしばあります。シリーズのdrop_duplicatesメソッドは重複した値をシリーズから除外します。keep引数(初期値first)に重複した値の除外方法を指定します。firstは重複した値の最初の値を残し、それ以外を除外します。lastは重複した値の最後を残し、それ以外を除外します。Falseと指定すると重複した値のすべてがシリーズから除外されます。重複する値を持つシリーズを作成して、drop_duplicatesメソッドのkeep引数へfirstを指定して、重複した値の最初の値を残す方法で重複を除外してみましょう(リスト2.35)。int64リスト2.35ではシリーズserのインデックスラベルa、c、fが残り、値が重複しているそれ以外の要素が除外されました。keep引数へFalseを指定した場合、値が重複しているすべての要素の除外を行うため、実行して残るのはインデックスラベルf(値3)のみとなります(リスト2.36)。int64欠損値データの一部が欠落している箇所を「欠損値」と呼びます。欠損値の扱いについては6.1節で詳しく解説します。この章ではシリーズオブジェクトに用意されている欠損値を扱うメソッドや属性について確認してみましょう。欠損値の扱い方は様々ですが、最も単純な対処法は欠損値をデータから取り除くことです。欠損値を含むシリーズを作成して欠損値が含まれるかの確認を行い、欠損値をデータから取り除いてみましょう。欠損値を含むシリーズをNumPyで非数を示す定数であるnp.nanを使って作成します(リスト2.37)。float64シリーズのisnaメソッドは要素に欠損値が含まれるかを確認します。シリーズの要素が欠損値の箇所はTrue、それ以外はFalseの値を持つ同サイズのシリーズを戻します。シリーズserのインデックスラベルbとeの要素はNaNで欠損値となります。isnaメソッドで戻されるシリーズもインデックスラベルbとeのみTrue、それ以外はFalseとなっているのが確認できます(リスト2.38)。boolisnaメソッドはbool型の値を持つ同じサイズのシリーズを戻しますので、角括弧によるインデックス参照を使うことで欠損値の該当箇所のみをシリーズから取り出すことも可能です(リスト2.39)。float64欠損値をデータから除外する場合はdropnaメソッドが便利です。dropnaメソッドは要素が欠損値の箇所を除外したシリーズを戻します。シリーズserの要素が欠損値の箇所であるインデックスラベルbとeが除外されたシリーズが戻されるのが確認できます。float64pandasのシリーズには他にも多くのメソッドが用意されています。第3章からはデータ参照やファイルの読み込みなど、より実用的な操作方法を詳しく解説します。本書について本書は、機械学習やデータサイエンスの現場では、データ処理に必要な定番のライブラリ「pandas」を用いて、前処理の基本と様々な前処理手法について、あますところなく解説した書籍です。タクヤ)翔泳社マーケティング課。MarkeZine、CodeZine、EnterpriseZine、Biz/Zine、ほかにて翔泳社の本の紹介記事や著者インタビュー、たまにそれ以外も執筆しています。モブプログラミングを取り入れて開発を効率化させるヒント9Pythonや生成AI活用など無料で基礎が学べるプログラミング学習講座「スタディングテック」提供開始10企業の7割超が「2025年の崖」を理解していないことが明らかに。モブプログラミングを取り入れて開発を効率化させるヒント9Pythonや生成AI活用など無料で基礎が学べるプログラミング学習講座「スタディングテック」提供開始10企業の7割超が「2025年の崖」を理解していないことが明らかに。モブプログラミングを取り入れて開発を効率化させるヒント9Pythonや生成AI活用など無料で基礎が学べるプログラミング学習講座「スタディングテック」提供開始10企業の7割超が「2025年の崖」を理解していないことが明らかに。新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。