PandasパッケージのDataFrameの行抽出と削除のサンプルです。
加工前のDataFrameの値
import pandas as pd import numpy as np df = pd.DataFrame( [['ご飯 ', 200, 'east'], ['パンÅ', 150, 'west'], ['うどん', 120, np.NaN], ['パンB', np.NaN, 'west']], index=['100', '101', '102', '103'], columns=['item', 'price', 'area'] ) print(df) item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west 102 うどん 120.0 NaN 103 パンB NaN west
- 行抽出の仕組み
- 特定列の文字列による行の抽出
- 特定列の数値の範囲で抽出
- 列に特定の値を持つ行の削除
- 列にNan又はNoneを持つ行を削除
行抽出の仕組み
ここから下の方で、df[df[…]…]と記述して行の抽出をしていきます。謎な呪文のように見えますが、内側の「df[…]」によって、抽出する行の一次元配列を取得し、それを条件によって真偽値に変換して新たな行列を作っているだけです。
列名を指定し、一次元配列を作成します。
>>> df["area"] 100 east 101 west 102 NaN 103 west Name: area, dtype: object
一次元配列ですが、List型ではなくSeries型です。
>>> type(df["area"]) <class 'pandas.core.series.Series'>
この生成したSeriesと抽出条件によって、真偽のSeriesができます。これを用いて新たなDataFrameを生成できます。
>>> df["area"]=="east" 100 True 101 False 102 False 103 False Name: area, dtype: bool >>> df[df["area"]=="east"] item price area 100 ご飯 200.0 east
特定列の文字列による行の抽出
特定列にある文字列セルに条件を指定し、該当する行を抽出又は削除するサンプルです。
特定列の値が指定文字列に一致する行の抽出
“area”列が”east”の行を抽出します。
>>> df[df["area"]=="east"] item price area 100 ご飯 200.0 east
特定列の値が指定文字列に一致する行の抽出
“area”列の値に、”st”を含む行を抽出します。
>>> df[df["area"].str.contains('st', na=False)] item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west 103 パンB NaN west
※Sireas.str.contains()は、列の値が特定の文字列を含む時、行を抽出する関数です。(詳細後述)
Sireas.str.contains() “na”の設定による効果の違い
- na=False
- area列の値がNaNやNoneが含まれる行は、抽出対象から外される
- na=True
- area列の値がNaNやNoneが含まれる行も、抽出する
※抽出結果は、他の列のNaNやNoneに依存しません
na=Falseの時の抽出結果
>>> df[df["area"].str.contains('west', na=False)] item price area 101 パンÅ 150.0 west 103 パンB NaN west
na=Trueの時の抽出結果
>>> df[df["area"].str.contains('west', na=True)] item price area 101 パンÅ 150.0 west 102 うどん 120.0 NaN 103 パンB NaN west
Sireas.str.contains() 列の文字列の条件が、複数の時の設定
“area”列の値が、”west”又は”east”の行を抽出
>>> df[df["area"].str.contains('west|east', na=False)] item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west 103 パンB NaN west
Series.str.contains(pat、case = True、flags = 0、na = nan、regex = True)の詳細
この関数は正規表現を入れられるため、後述する他の抽出関数は使わなくなります。
入力パラメータ
- pat
- 文字シーケンスまたは正規表現
- case
- Trueの時、大文字と小文字を区別
- flags
- reモジュールに渡すフラグ(例:re.IGNORECASE)
- na
- 欠損値の抽出の有無(先述)
- regex
- Trueの場合、patが正規表現として処理
戻り値
Seriesまたはindex
Sireas.str.contains()以外の文字列による抽出関数の一覧
Series.str.contains()以外の抽出関数です。
Series.str.startswith() 特定の文字列で始まる時、抽出
>>> df[df["area"].str.startswith('ea',na=False)] item price area 100 ご飯 200.0 east
Series.str.endswith() 特定の文字列で終わる時、抽出
>>> df[df["area"].str.endswith('st',na=False)] item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west 103 パンB NaN west
Series.str.match() 正規表現で抽出
>>> df[df["area"].str.match('eas', na=False)] item price area 100 ご飯 200.0 east
列毎に抽出条件を設定する場合の行の抽出
列毎に条件を付け抽出するサンプルです。
「”item”列に”パン”を含む」かつ「”area”が”west”」の行の抽出
>>> df[df["item"].str.contains('パン') & (df["area"]=='west')] item price area 101 パンÅ 150.0 west 103 パンB NaN west
※複数の条件では、条件毎に()で括る必要があります。
※& | ~で複数条件をコントロールします。and or notは使えません。
「”item”列に”パン”を含む」又は「”area”が”west”」の行の抽出
>>> df[df["item"].str.contains('パン') | df["area"].str.contains('west', na=True)] item price area 101 パンÅ 150.0 west 102 うどん 120.0 NaN 103 パンB NaN west
特定列の数値の範囲で抽出
数値による範囲指定であるため、NaNやNoneを含む行は、抽出対象から外れます。
「”price” <= 150」の行を抽出
>>> df[df["price"] <= 150] item price area 101 パンÅ 150.0 west 102 うどん 120.0 NaN
「120 < "price" <= 150」の行を抽出
>>> df[(df["price"] > 120) & (df["price"] <= 150)] item price area 101 パンÅ 150.0 west
※複数の条件では、条件毎に()で括る必要があります。
※& | ~で複数条件をコントロールします。and or notは使えません。
列に特定の値を持つ行の削除
「削除したい行」でない行を抽出して、行の削除を実現します。
「"area"が"east"の行」でない行を抽出
>>> df[~(df["area"]=='east')] item price area 101 パンÅ 150.0 west 102 うどん 120.0 NaN 103 パンB NaN west
※'~'は、真偽の反転(not)を表します。
列にNan又はNoneを持つ行を削除
特定列のデータ欠損がある行を削除します。
"area"列に欠損がある行を削除
>>> df.dropna(subset=['area'], axis=0) item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west 103 パンB NaN west
※axisは削除対象となる行・列の指定で、axis=0は行を削除、axis=1は列を削除 となります。
特定列にあるデータ欠損がある行を削除で、特定列が複数の場合
"price"列と"area"列に、欠損がある行を削除します。
>>> df.dropna(subset=['price','area'], axis=0) item price area 100 ご飯 200.0 east 101 パンÅ 150.0 west
コメント