Python pandas の主要な 2 次元ラベル付きデータ構造で、型付き列を備え、強力なデータ操作、インデックス作成、分析機能を提供します。
によって Databricks Staff による投稿

データサイエンスに関していうと、 pandas DataFrame を使いこなすことで、データ分析の効率を高め、意思決定を支援する基盤になり得ます。ただし、そのためには適切なデータ構造が必要です。これらを上手く活用することで、データの操作や分析を最大限効率的にできるようになります。
この目的のために使える最も便利なデータ構造(data structure)の1つが pandas DataFrame です。
pandas とは、プログラミング言語 Python でデータ分析を行うためのオープンソースのライブラリで、高速で適応性の高いデータ構造を提供します。この使いやすいデータ操作ツールは、ウェス・マッ キニー氏が開発したものでNumPy パッケージ上に構築されています。その主要なデータ構造は DataFrame と呼ばれています。
「pandas DataFrameとは何か」と疑問に思った方に向けて、ここから基本を整理します。これから深く掘り下げて説明します。ここで知っておいていただきたいのは、 pandas DataFrame はデータに大きく依存する分野での使用に適したユーザーフレンドリーなツールであるということです。これには、科学計算、機械学習や前述のデータサイエンスが含まれます。
pandas の具体的な内容を下で説明します。pandas DataFrame の構築方法、 pandas DataFrame を使い始める方法、 pandas DataFrame を使うメリットなど、いくつかのトピックを取り上げます。

pandas は、 CSV や TSV ファイル、SQL (Structured Query Language) データベースなどのデータを読み込み、データフレームと呼ばれる行と列を持つ Python オブジェクトに変換します。このオブジェクトは、Excel やSPSS などの統計ソフトウェアのテーブルと類似しています。Pandas DataFrame は、 Excel の仕組みと同様に、さまざまな機能を提供します。オブザベーションの行と変数の列に表形式のデータを格納して操作したり、与えられたデータセットから必要な情報を抽出したりすることが可能です。
Apache Spark 3.2 の pandas API を実行することができます。これにより、 pandas のワークロードを均等に分散させ、すべての作業を確実に行うことができます。
さて、ここまで pandas が提供する2種類のデータ構造を説明してきましたが、ここで一歩下がって、 pandas DataFrame が実際にどのようなものかを見てみましょう。ここでは、簡単な定義と、 DataFrame が受け入れることのできる入力の種類の便利なリストを紹介します。
Pandas DataFrame とは、表形式のデータを表示、操作する方法の一つです。二次元のデータ構造で、データを行と列に整理してテーブルとして表示します。DataFrame は、ゼロから作成することも、NumPy 配列のような他のデータ構造を利用することも可能です。
pandas DataFrame を使用すると、様々な形式のデータを様々なソースから取り込むことができます。例えば、 pandas の内容をインポートできるのと同時に、 NumPy の配列をインポートすることができます。
DataFrame で入力が可能な主なデータタイプは、次のとおりです。
pandas が提供するストラクチャや pandas DataFrame が何であるかを知っていることは、必ずしも pandas DataFrame の全てを知っているということではありません。そこで、このセクションでは pandas DataFrame をどのように扱うかについて、よくある質問に回答していきます。
あなたの質問が以下の6つの回答に該当しない場合、このまま読み進めてください。この他にもいくつかのトピックを取り上げ、この記事の途中で重要な質問にお答えします。
DataFrameの全ての列(または行やインデックス)が常に同じように必要なわけではありません。実際、 DataFrame オブジェクトを削除する必要がある場合もありますので、その方法を紹介します。
インデックスから順番に削除していく方法を紹介します。これらと記事中の以下のすべての例では、一般的な慣習として、コード内で "DataFrame" を "df" と略記することにします。
DataFrame は常に何らかのインデックスを持つため、インデックスを完全に削除することは困難ですが、インデックスラベルの変更やその名前を完全に削除することは可能です。名前の削除は、 del df.index.name コマンドを実行することで実施可能です。
また、DataFrame のインデックスをリセットすることも可能です。これは、インデックス値が重複している場合に役立ちます。必要なのは、インデックスをリセットし、重複を削除し、重複のない新しい列インデックスを復活させることです。
列の削除はもう少し簡単です。ドロップ( )方式で、列を取り出すことができます。この場合、削除したい列のラベルを入力する必要がありますので、ドロップ( )コマンドを実行する前に、正しい列名をメモしておいてください。また、引数 inplace を True にすると、 DataFrame を再割り当てせずに列を削除できるようになります。
最後に、 DataFrame の行を削除する方法を紹介します。
df.drop_duplicates( ) を実行すると、行ラベルに指定し た条件に応じて重複している行が削除されます。列に対して動作するのと同じ .drop() メソッドを使用することもできますが、その場合は行のインデックスを指定してドロップします。この場合、必ずインデックスをリセットしてください。
具体的に欠損値を持つ行を削除するには、DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) を使用できます。これは、Null 値を持つ行を自動的に取り出します。また、関数のパラメータを調整して、特定のデータセクションにおいて欠損値を削除するかどうかを決定することもできます。
Null 値を特定の値に置き換えたい場合は、.dropna() で削除するのではなく、 .fillna() コマンドを使用します。
インデックスや列の名前の変更は、削除するよりも簡単でわかりやすいです。これらのオブジェクトの名前を変更するために必要なことは、 .rename( ) メソッドを使用し、新しい値を与えたいインデックス(または列)を記入することだけです。
リネームタスクで引数 inplace を False に変更すると、列の名前を変更しても DataFrame が再アサインされなくなります。
ほとんどの場合、 DataFrame のユーザーは、 DataFrame 内の値を編集、変更、フォーマットする必要があります。そのために知っておくべき重要な戦略について見ていきます。
文字列のすべてのインスタンスを置換したい場合は、 .replace() コマンドを使い、(変更する値、変更先の値)のフォーマットで隙間を埋めることができます。
そして、変更したい文字列や値 のすべてのインスタンスを、変更する項目に自動的に置換します。
もう一つ必要なのは、文字列から不要な部分を取り除くフォーマット機能です。map ()コマンドは、 result 列で使用すると、その列の各要素に選択したラムダ関数を適用します。
また、列のテキストを複数の行に分割することもできますが、これは少し複雑なので、簡単なチュートリアルを紹介します。
まず、長すぎる行を特定し、どの行を分割すべきかをわかるようにします。行を特定後、その列の中にある文字列をスペースで囲みます。次のステップは、行をまたいで分割される値を受け取り、 Series オブジェクトに入れることです。
もし、 Series に NaN 値があったとしても、問題ありません。Series を積み上げるだけで、最終的な Series のコピーには不要な NaN 値が含まれないことが保証されます。
積み上げた Series を希望のフォーマットにするためには、 DataFrame と並ぶようにレベルを落とす必要があります。その後、 Series を DataFrame に変換し、元の DataFrame に戻し、元の DataFrame から問題のある列を削除します。最後のステップ(列の削除)により、重複の発生を防ぐことができます。
DataFrame のデータに適用可能な最後のフォーマットは、 DataFrame の行または列に関数を適用する形です。
まず、 .loc[ ] または .iloc[ ] を用いて作業したい行を選択します。しかし、ここでは DataFrame を使用しているので、より具体的には df.loc と df.iloc を使うことになるでしょう。そして、正しい行を選択した後、 apply() を使い、行または列に doubler のような機能を適用することができます。
空の DataFrame を作るには、 pandas DataFrame() 関数を使うことに尽きます。
NaN で DataFrame を初期化したい場合は、単純に float 型を持つ numpy.nan の使用を選択できます。これは、新しい DataFrame のデータ値が、デフォルトで float 型になることを意味します。dtype 属性を入力し、探している型を記入することで、このデフォルトの設定を回避することができます。
DataFrame( ) 関数は、 DataFrame に入れたいデータ、つまりインデックスと列を渡すことを前提にしています。このデータは、必要な数だけ種類を持つことができます。さらに、これまで説明してきたように、 dtype 属性を用いることで、いつでも強制的にそのデータ型を指定することができます。
空の DataFrame が使用する軸ラベルやインデックスを選択できます。もしこれを行わない場合、 pandas DataFrame が常識的なルールで自動的に構築してくれます。
原則的にはそうで、実際にはもう少し複雑です。
pandas は日付が入力されていることを認識できますが、正しい方向に少し誘導することでうまく機能します。具体的には、 CSV ファイルや類似ファイルなどからデータを取り込む際に、 parse_dates 引数を追加します。CSV ファイルからデータを取り込む場合、以下のようになります。
pd.read_csv('yourFile', parse_dates=True)
この方法は、数値書式を使用する日付に最も適しています。しかし、すべての日付がこのような形式を取るわけではありません。
変わった日付形式や、 DataFrame が認識しにくい日付形式の場合は、独自のパーサーを作成します。これらは、日付と時刻の入力認 識を制御するためのフォーマット文字列を使用するラムダ関数の形式をとる場合があります。
pandas は、どのような方法でナッジを与えても、完了後に日時を認識できます。つまり、最小限の入力で、 DataFrame に日付ベースの情報を取り込むように指示することができます。
データ分析は、 pandas DataFrame の最も重要な用途の一つです。そのため、 DataFrame の形状を変更できることが重要で、データ分析のニーズに合った理想的なストラクチャを形成できます。
では、「いつ DataFrame を再形成すればいいのか?」という問いに対する答えは、現在のフォーマットが、実施予定のデータ分析に有用でない場合やそのために新しい列や行を作成することを検討していない場合です。そして、なぜ再形成すべきかというと、データ分析に最適な形状を見つけるためです。
残す質問はあと1つ、「どのように再形成するの?」です。
ピボットとスタックを選ぶことができます。また、"unstacking and melting" メソッドも使用することができます。ここでは、これら3つのアプローチについて、それぞれどのように機能し、どのように DataFrame の形状を再形成するために使用することができるかを詳しく説明します。
Pivot メソッドで DataFrame を再形成する
まず、ピボットオプションから見ていきましょう。これは、元のテーブルから新しいテーブルを作成し、新しいコピーを思い通りの形にすることができます。この機能を使うには、3つの引数を受渡す必要があります。
まず、値です。この引数は、新しい DataFrame に 取り込む元の DataFrame の値を選択するポイントなので、何を含み、何を省くかを選択できます。
次に、列を渡します。渡したものはすべて、最終的なテーブルの列になります。
最後に、新しいテーブルで使用するインデックスを選択する必要があります。
結果のテーブルにどのようなデータを組み込むかを、具体的にすることが大切です。例えば、エラーメッセージが表示されるため、指定した列に重複した値を含む行を含めることはできません。他の例では、最終的なテーブルに含める値を正確に選ばないと、複数の列でピボットを行うことになってしまいます。
次は、積み上げの検討に移ります。
Stacking メソッドで DataFrame を再形成する
DataFrameを積み上げることで、高さが出ます。その事実を認識できるかもしれません。3つ目の質問で、 DataFrame のデータをどのようにフォーマットするかのウォークスルーで、スタッキングに触れました。
技術的な説明としては、最内列のインデックスを移動して、代わりに最内行のインデックスに変更しているのです。これは、新しいインデックスと新しいレベルの行ラベルを持つ DataFrame を取得し、それは最も内側のレベルに位置することになります。
次に、いかにして unstack するかを考えます。ご想像のとおり、 stack の逆の処理で、stack が最内部の例インデックスを移動させるのに対し、 unstack は最内部の行インデックスを移動させます。つまり、unstack すると、最内部の行インデックスが移動し、代わりに最内部の列インデックスとして使用できるようになるのです。unstack は Melting とセットで使われます。次を見てみ ましょう。
Melting メソッドで DataFrame を再形成する
Melting は、データフレームが1つ以上の列を識別子変数として使用し、残りの列を測定変数として使用する場合に最適です。そのような場合、Melting は基本的に DataFrame の幅を広げるのではなく、長くすることができます。
Melting が、測定された変数が DataFrame の幅ではなく高さに配置されることを確認できるように、基本的に測定された変数を行軸に un-pivot することになります。最終的には、変数と値の2つの列を含むことになります。
DataFrame は Excel を使うのと同じように使うことができ、 pandas DataFrameも例外ではありません。
基本的には、 pandas DataFrame をデータ構造として使用できます。また、表計算ソフトと同じように、データの加工や分析にも利用できます。
データを読み込んだり操作したりする必要があるとき、 pandas はその目的を達成するための便利なツールです。pandas の DataFrame にデータを入力する方法は既に説明しましたが、 pandas は様々な種類のデータに対応しているので、たくさんの種類のデータを取り込むことができます。これにより、どのような形式のデータであっても、情報を取り扱うことができるようになります。
そして、上で説明したフォーマット処理を用いることで、データを必要な形式に変換することができます。すでに持っているデータをより使いやすい形に変換し、ニーズに合った形で提供することができます。
pandas は Python と一緒に使うために設計されているので、この2つはほとんど常に一緒に使うことができます。つまり、 スケーリング SHAP 計算のようなタスクを PySpark と pandas を使って簡単に実行できるのです。
pandas DataFrame の中で特定のタスクや関数を実行する方法について、より具体的に説明します。pandas DataFrame の作成、インデックスの作成、反復処理などを説明した後、そもそも pandas を使うことの利点について詳しく説明します。
pandas DataFrame は様々な使い方ができる万能ツールなので、いくつかの異なる戦略を用いて作成することも可能です。
空の pandas DataFrame を設定する方法は、質問4への回答ですでに説明しました。これは、 pandas DataFrame を新規に作成する際に使用できるメソッドの1つです。この方法は、 pandas に「再配置」する別のデータ構造をまだ持っていない場合、言い換えれば、完全に白紙の状態から始めたい場合に最適です。
NumPy の ndarray から pandas DataFrame を作成する方法について見ていきます。
要するに、 NumPy 配列から非常に簡単に DataFrame を作ることができます。必要なことは、選択した配列を pandas のデータ引数で DataFrame ( ) 関数に渡すだけです。 DataFrame は NumPy のデータを使って、新しい DataFrame を形作ります。引数はこのようなものになります。
print(pd.dataframe [ ] )
そして、入力するデータは、角括弧の中に入ります。
値、インデックス、カラム名はすでに NumPy 配列に含まれているはずで、 pandas はあなたの特定の情報を使ってあなたに合った DataFrame を作ることができます。
pandas DataFrame を使う利点の1つは、 DataFrame ()関数が多くの異なるス トラクチャを入力として受け取ることができることです。NumPy 以外のストラクチャを用いてストラクチャを作成する場合も、ほとんど同じように処理します。つまり、DataFrame ()関数に配列を渡し、その情報を使って新しい DataFrame を作成するように pandas に指示することになります。
新しい DataFrame を作成するために、 DataFrame を入力として使用することもできます。そのためには、 my_df = pd.DataFrame ( ) を使い、入力データを数式に挿入することになります。
元の辞書のキーは、 Series のインデックスに含まれ、 DataFrame にも含まれます。インポートが完了すると、キーは自動的にソートされます。
shape プロパティは、 .index と一緒に使用できます。プロパティを使用して、新しく作成した DataFrame のディメンションを知ることができます。これにより、幅と高さの両方が表示されます。高さだけを知りたい場合は、 LEN ()関数(これも .index プロパティと一緒に)を使用すると、DataFrame の高さが表示されるようになります。
これらの方法は、 DataFrame のディメンションに NaN 値をすべて含めて表示するものです。一方、 df[0].count() を使用すると、NaN 値なしで DataFrame の高さが表示されます。
データのインデックス化は、コレクションの中の物理的なアイテムのインデックス化と同じように考えることができます。つまり、 pandas におけるインデックス化は、データをソートし、特定の値、行、列を選んで整理することを意味します。
pandas DataFrame で可能なインデックス化は、 Excel でできるようなインデックス化と似ています。最大の違いは、 pandas のインデックス化がより詳細で多機能であるため、データを思い通りに扱うための幅広いオプションにアクセスできることです。
pandas では、 DataFrame のデータの特定の行や列を選択することでインデックスを作成することができます。正確な選択には、さまざまな形があります。数行だけ使って全列を使いたい場合もあれば、その逆の場合もあります。また、特定の行や列が必要な場合もあるでしょう。
データの特定の部分集合を選択することから、インデックス化は部分集合選択と呼ばれることもあります。
pandas DataFrame でインデックスがどのように機能するかについて説明します。
pandas でインデックスを作成するには、実際には4つの別々の方法を使うことができますので、それぞれの概要について簡単に説明します。まず、 df[ ] ですが、これはインデックス演算子関数です。また、ラベルを扱う場合は、 df.loc[ ] を使うこともできます。df.iloc[] は、主に位置や整数を中心としたデータで使用します。最後に、ラベルベースと整数ベースの両方のデータに対応する関数、 df.ix[ ] があります。
先ほど紹介した4つのインデックス作成スタイルは、インデクサと呼ばれ、データのインデックスを作成する最も一般的な手法の一つです。
pandas DataFrame で同じ文節群を繰り返し実行したいとき、つまり行を反復処理したいときのために準備することは良いことです。
これも pandas ではかなり簡単に実行できる機能です。for ループと iterrows ()コマンドを併用して、反復処理を設定することになります。これにより、 DataFrame の行を( index, Series )のペアという形でループに入れることができます。
そうすれば、結果に( index, row )のタプルを取得することができます。
pandas で反復処理を行う場合、辞書のように DataFrame に反復処理を指示することになります。つまり、オブジェクトのキーに対して、行と列で次々に項目を取りながら反復しています。
pandas DataFrame は、ユーザに様々な特徴や機能を提供し、 pandas ライブラリに入力されたあらゆるデータを柔軟に操作する機会を提供しており、高度な視覚的なツールとして設計されているわけではありません。基本的に、よりバックステージビューを見ることができます。