Python
 Computer >> コンピューター >  >> プログラミング >> Python

正規表現とデータ型を活用して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)
budgetidoriginal_languageoriginal_titlepopularityrelease_daterevenueruntimestatustitlevote_averagevote_count
023700000019995enAvatar150.43757710/12/20092787965087162.0ReleasedAvatar7.211800
1300000000285enPirates of the Caribbean: At World's End139.08261519/05/2007961000000169.0ReleasedPirates of the Caribbean: At World's End6.94500
2245000000206647enSpectre107.37678826/10/2015880674609148.0ReleasedSpectre6.34466
325000000049026enThe Dark Knight Rises112.31295016/07/20121084939099165.0ReleasedThe Dark Knight Rises7.69106
426000000049529enJohn Carter43.9269957/03/2012284139100132.0ReleasedJohn Carter6.12124

単一の列を選択する

インデックス演算子([])に列名を文字列またはリストとして渡すと、その列の値が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
0Avatar
1Pirates of the Caribbean: At World's End
2Spectre
3The Dark Knight Rises
4John Carter
......
4802My Date with Drew

複数の列を選択する

複数の列を選択するには、列名をリストとして渡します。

# 複数のDataFrame列を選択
movies_dataset[["title", "runtime", "vote_average", "vote_count"]]
titleruntimevote_averagevote_count
0Avatar162.07.211800
1Pirates of the Caribbean: At World's End169.06.94500
2Spectre148.06.34466
3The Dark Knight Rises165.07.69106
4John Carter132.06.12124
...............
4802My Date with Drew90.06.316

コードの可読性を保つため、列名のリストを変数として定義し、コード内でその変数を使用することをおすすめします。複数の列名を直接記述すると、コードが読みにくくなるためです。

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_titletitle
0AvatarAvatar
1Pirates of the Caribbean: At World's EndPirates of the Caribbean: At World's End
2SpectreSpectre
3The Dark Knight RisesThe Dark Knight Rises
4John CarterJohn Carter

regexパラメータ

regexパラメータは、正規表現を使ってより柔軟に列名を選択できる方法です。

# "t" で終わる列を選択
movies_dataset.filter(regex="t$").head()
budgetvote_count
023700000011800
13000000004500
22450000004466
32500000009106
42600000002124

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)
budgetidpopularityrevenueruntimevote_averagevote_count
023700000019995150.4375772787965087162.07.211800
1300000000285139.082615961000000169.06.94500
2245000000206647107.376788880674609148.06.34466

c) すべての数値型の列を抽出する

すべての数値データ型をまとめて取得したい場合は、numberを指定するだけです。

movies_dataset.select_dtypes(include=["number"]).head(3)
budgetidpopularityrevenueruntimevote_averagevote_count
023700000019995150.4375772787965087162.07.211800
1300000000285139.082615961000000169.06.94500
2245000000206647107.376788880674609148.06.34466

d) 特定のデータ型を除外する

movies_dataset.select_dtypes(exclude=["object"]).head(3)
budgetidpopularityrevenueruntimevote_averagevote_count
023700000019995150.4375772787965087162.07.211800
1300000000285139.082615961000000169.06.94500
2245000000206647107.376788880674609148.06.34466

注意: Pandasには「string」というデータ型は存在せず、文字列は自動的に「object」型に変換されます。そのため、TypeError: data type "string" not understood という例外が発生した場合は、「string」の代わりに「object」を指定してください。

  1. Microsoft Accessで列を固定・固定解除する方法

    Microsoft Accessには、データシートをスクロールしても特定の領域を常に表示しておける「フィールドの固定(Freeze)」という便利な機能があります。この機能を使えば、テーブル、クエリ、フォーム、ビュー、ストアドプロシージャなどのデータシート上で、1つまたは複数のフィールド(列)を固定できます。固定したフィールドは、自動的にデータシートの左端へ移動します。 Accessで列を固定・固定解除する手順 以下の手順に従って、Microsoft Accessの列を固定したり、その固定を解除したりできます。 Microsoft Accessで列を固定する方法 Microsoft Acces

  2. PythonのTkinterでファイル選択ダイアログを使い、選択したディレクトリの場所を表示・保存する方法

    ダイアログボックスは、さまざまな種類のアプリケーションでおなじみのUI要素であり、ユーザーとの対話が重要となるアプリケーション開発において非常に役立ちます。ダイアログボックスを利用すれば、ユーザーにファイルの選択を求め、その後、ファイルの読み込みや書き込みといった操作を実行できます。Pythonでは、filedialogモジュールを使用することで、こうしたダイアログボックスを簡単に作成できます。 サンプルコード 以下の例では、ローカルディレクトリからファイルを選択するようユーザーに促し、選択されたファイルの場所(パス)をラベルウィジェットで表示するアプリケーションを作成します。 #Import