【Pandas】DataFrameの行抽出と削除のサンプル

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

行抽出の仕組み

ここから下の方で、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

コメント

タイトルとURLをコピーしました