正規表現とデータ型を活用してPandas DataFrameの複数列を効率的に選択する方法
DataFrameは、スプレッドシートやデータベースのように行と列で構成されたデータセットと考えることができます。DataFrameは2次元(2D)のオブジェクトです。
1次元(Series)と2次元(DataFrame)の違い
「1D」と「2D」という用語に混乱していませんか?両者の大きな違いは、特定のデータポイントに到達するために必要な参照情報の数です。
Series(1次元)の場合、値を取り出すには行インデックスという1つの参照点だけで十分です。一方、DataFrame(2次元)では、1つの参照点だけでは不十分で、行の値と列の値の交差点を指定する必要があります。
CSVファイルからDataFrameを作成する
以下のコードは、CSVファイルからPandas DataFrameを作成する例です。.read_csv()メソッドはデフォルトでDataFrameを返します。moviesデータセットは、kaggle.comで「movies」と検索することでダウンロードできます。
"""スクリプト: CSVファイルからPandas DataFrameを作成する"""
import pandas as pd
movies_dataset = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
# 1. オブジェクトの型を確認
type(movies_dataset)
# 2. 先頭5件を表形式で表示
movies_dataset.head(5)| budget | id | original_language | original_title | popularity | release_date | revenue | runtime | status | title | vote_average | vote_count | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | en | Avatar | 150.437577 | 10/12/2009 | 2787965087 | 162.0 | Released | Avatar | 7.2 | 11800 |
| 1 | 300000000 | 285 | en | Pirates of the Caribbean: At World's End | 139.082615 | 19/05/2007 | 961000000 | 169.0 | Released | Pirates of the Caribbean: At World's End | 6.9 | 4500 |
| 2 | 245000000 | 206647 | en | Spectre | 107.376788 | 26/10/2015 | 880674609 | 148.0 | Released | Spectre | 6.3 | 4466 |
| 3 | 250000000 | 49026 | en | The Dark Knight Rises | 112.312950 | 16/07/2012 | 1084939099 | 165.0 | Released | The Dark Knight Rises | 7.6 | 9106 |
| 4 | 260000000 | 49529 | en | John Carter | 43.926995 | 7/03/2012 | 284139100 | 132.0 | Released | John Carter | 6.1 | 2124 |
単一の列を選択する
インデックス演算子([])に列名を文字列またはリストとして渡すと、その列の値がSeriesまたはDataFrameとして返されます。
- 文字列で渡した場合:戻り値は Series
- リストで渡した場合(要素が1つでも):戻り値は DataFrame
それぞれの例を見てみましょう。
# Seriesとして選択 movies_dataset["title"]
0 Avatar 1 Pirates of the Caribbean: At World's End 2 Spectre 3 The Dark Knight Rises 4 John Carter ... 4798 El Mariachi 4799 Newlyweds 4800 Signed, Sealed, Delivered 4801 Shanghai Calling 4802 My Date with Drew Name: title, Length: 4803, dtype: object
# DataFrameとして選択 movies_dataset[["title"]]
| title | |
|---|---|
| 0 | Avatar |
| 1 | Pirates of the Caribbean: At World's End |
| 2 | Spectre |
| 3 | The Dark Knight Rises |
| 4 | John Carter |
| ... | ... |
| 4802 | My Date with Drew |
複数の列を選択する
複数の列を選択するには、列名をリストとして渡します。
# 複数のDataFrame列を選択 movies_dataset[["title", "runtime", "vote_average", "vote_count"]]
| title | runtime | vote_average | vote_count | |
|---|---|---|---|---|
| 0 | Avatar | 162.0 | 7.2 | 11800 |
| 1 | Pirates of the Caribbean: At World's End | 169.0 | 6.9 | 4500 |
| 2 | Spectre | 148.0 | 6.3 | 4466 |
| 3 | The Dark Knight Rises | 165.0 | 7.6 | 9106 |
| 4 | John Carter | 132.0 | 6.1 | 2124 |
| ... | ... | ... | ... | ... |
| 4802 | My Date with Drew | 90.0 | 6.3 | 16 |
コードの可読性を保つため、列名のリストを変数として定義し、コード内でその変数を使用することをおすすめします。複数の列名を直接記述すると、コードが読みにくくなるためです。
columns = ["title", "runtime", "vote_average", "vote_count"] movies_dataset[columns]
filter()メソッドで列名から列を選択する
.filter()メソッドは、文字列を使って列を検索・選択するのに非常に便利なメソッドです。SQLの LIKE %% 句とほぼ同じように動作します。なお、.filter()メソッドは実際のデータ値ではなく、列名のみを検査して列を選択することに注意してください。
.filter()メソッドは、選択操作に使用できる3つのパラメータをサポートしています。
- like
- regex
- items
likeパラメータ
likeパラメータは文字列を受け取り、その文字列が列名のどこかに含まれている列を検索します。
# 列名に "title" を含む列を選択 movies_dataset.filter(like="title").head(5)
| original_title | title | |
|---|---|---|
| 0 | Avatar | Avatar |
| 1 | Pirates of the Caribbean: At World's End | Pirates of the Caribbean: At World's End |
| 2 | Spectre | Spectre |
| 3 | The Dark Knight Rises | The Dark Knight Rises |
| 4 | John Carter | John Carter |
regexパラメータ
regexパラメータは、正規表現を使ってより柔軟に列名を選択できる方法です。
# "t" で終わる列を選択 movies_dataset.filter(regex="t$").head()
| budget | vote_count | |
|---|---|---|
| 0 | 237000000 | 11800 |
| 1 | 300000000 | 4500 |
| 2 | 245000000 | 4466 |
| 3 | 250000000 | 9106 |
| 4 | 260000000 | 2124 |
itemsパラメータ
itemsパラメータは、インデックス演算子に列名を文字列やリストとして渡すことと重複した機能ですが、異なる点としてKeyErrorが発生しないという特徴があります。存在しない列名を指定してもエラーにならず、単に無視されます。
select_dtypes()でデータ型から列を選択する
特定のデータ型の列だけをフィルタリングして使いたい場合は、.select_dtypesメソッドが便利です。このメソッドは列のデータ型に基づいて動作します。
.select_dtypesメソッドは、includeまたはexcludeパラメータに対して、単一のデータ型(文字列)または複数のデータ型(リスト)を受け取ることができ、指定されたデータ型の列だけを持つDataFrameを返します。
- include:指定したデータ型の列を含める
- exclude:指定したデータ型の列を除外する
まず、データセットに含まれるデータ型とその列数を確認してみましょう。
movies_dataset = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
movies_dataset.dtypes.value_counts()object 5 int64 4 float64 3 dtype: int64
a) 整数型(int)の列を抽出する
movies_dataset.select_dtypes(include="int").head(3)
b) 整数型と浮動小数点型の列を抽出する
複数のデータ型は、以下のようにリストで指定できます。
movies_dataset.select_dtypes(include=["int64", "float"]).head(3)
| budget | id | popularity | revenue | runtime | vote_average | vote_count | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
c) すべての数値型の列を抽出する
すべての数値データ型をまとめて取得したい場合は、numberを指定するだけです。
movies_dataset.select_dtypes(include=["number"]).head(3)
| budget | id | popularity | revenue | runtime | vote_average | vote_count | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
d) 特定のデータ型を除外する
movies_dataset.select_dtypes(exclude=["object"]).head(3)
| budget | id | popularity | revenue | runtime | vote_average | vote_count | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
注意: Pandasには「string」というデータ型は存在せず、文字列は自動的に「object」型に変換されます。そのため、TypeError: data type "string" not understood という例外が発生した場合は、「string」の代わりに「object」を指定してください。
-
Microsoft Accessで列を固定・固定解除する方法
Microsoft Accessには、データシートをスクロールしても特定の領域を常に表示しておける「フィールドの固定(Freeze)」という便利な機能があります。この機能を使えば、テーブル、クエリ、フォーム、ビュー、ストアドプロシージャなどのデータシート上で、1つまたは複数のフィールド(列)を固定できます。固定したフィールドは、自動的にデータシートの左端へ移動します。 Accessで列を固定・固定解除する手順 以下の手順に従って、Microsoft Accessの列を固定したり、その固定を解除したりできます。 Microsoft Accessで列を固定する方法 Microsoft Acces
-
PythonのTkinterでファイル選択ダイアログを使い、選択したディレクトリの場所を表示・保存する方法
ダイアログボックスは、さまざまな種類のアプリケーションでおなじみのUI要素であり、ユーザーとの対話が重要となるアプリケーション開発において非常に役立ちます。ダイアログボックスを利用すれば、ユーザーにファイルの選択を求め、その後、ファイルの読み込みや書き込みといった操作を実行できます。Pythonでは、filedialogモジュールを使用することで、こうしたダイアログボックスを簡単に作成できます。 サンプルコード 以下の例では、ローカルディレクトリからファイルを選択するようユーザーに促し、選択されたファイルの場所(パス)をラベルウィジェットで表示するアプリケーションを作成します。 #Import