filtering_out

badge of tested backend

データフレームの行と列の除外

概要

pandasDataFrame.filter() メソッドでは引数 like に文字列を指定することで、列名に特定の文字列を含む列を選択できます。py4st.filtering_out() では、反対に列名に特定の文字列を含む列を除外します。実装の一部はR言語の dplyr::select() を参考にしました。

filtering_out(
    data: IntoFrameT,
    *args: Union[str, List[str], narwhals.Expr, narwhals.selectors.Selector], 
    contains: Optional[str] = None,
    starts_with: Optional[str] = None,
    ends_with: Optional[str] = None,
    axis: Union[int, str] = 'columns',
    to_native: bool = True,
)

引数 Argument

  • dataIntoFrameT(必須)
    入力データ。narwhals が受け入れ可能な DataFrame 互換オブジェクト
    (例:pandas.DataFramepolars.DataFramepyarrow.Table)を指定できます。
  • *argsstr / list[str] / narwhals.Expr / narwhals.Selector
    データフレームから除外したい列を指定します。指定方法は次のとおりです。
    • 列名(例:"x"
    • 列名のリスト(例:["x", "y"]
    • narwhals の式(Expr)(例:nw.col("x")) *axis = 'columns' の場合のみ
    • narwhals の Selector (例:ncs.numeric())*axis = 'columns' の場合のみ
  • containsstr
     列名(行名)の検索に使用する文字列。内部で使用している pandas.Series.str.contains に渡され、指定された文字列を列名(行名)に含む列(行)を除外します。
  • starts_withstr
     列名(行名)の検索に使用する文字列。内部で使用している pandas.Series.str.startswith に渡され、指定された文字列で列名(行名)が始まる列(行)を除外します。
  • ends_withstr
     列名(行名)の検索に使用する文字列。内部で使用している pandas.Series.str.endswith に渡され、指定された文字列で列名(行名)が終わる列(行)を除外します。
  • axis{0 or 'index', 1 or 'columns'}
    axis = 1 または axis = 'columns' なら列の削除を行い、axis = 0 または axis = 'index' なら行の削除を行います。 このオプションは、data がインデックス属性 (例: pandas.DataFrame) をもつ場合のみ有効です。
  • to_native: bool
    True の場合、入力と同じ型のデータフレーム(e.g. pandas / polars / pyarrow)を返します。
    False の場合、narwhals.DataFrame を返します。デフォルトは True で、to_native = False は、主にライブラリ内部での利用や、バックエンドに依存しない後続処理を行う場合を想定したオプションです。

使用例 Example

import py4stats as py4st
import pandas as pd
import narwhals.selectors as ncs
from palmerpenguins import load_penguins

penguins = load_penguins().head(3) # サンプルデータの読み込み

print(penguins)
#>   species     island  bill_length_mm  bill_depth_mm  flipper_length_mm  body_mass_g     sex  year  female
#> 0  Adelie  Torgersen            39.1           18.7              181.0       3750.0    male  2007       0
#> 1  Adelie  Torgersen            39.5           17.4              186.0       3800.0  female  2007       1
#> 2  Adelie  Torgersen            40.3           18.0              195.0       3250.0  female  2007       1
# *args で列名を直接指定
print(py4st.filtering_out(penguins, 'year', 'island', 'sex'))
#>   species  bill_length_mm  bill_depth_mm  flipper_length_mm  body_mass_g
#> 0  Adelie            39.1           18.7              181.0       3750.0
#> 1  Adelie            39.5           17.4              186.0       3800.0
#> 2  Adelie            40.3           18.0              195.0       3250.0

# narwhals.selector の使用例 文字列型の変数を除外
print(py4st.filtering_out(penguins, ncs.string()))
#>    bill_length_mm  bill_depth_mm  flipper_length_mm  body_mass_g  year
#> 0            39.1           18.7              181.0       3750.0  2007
#> 1            39.5           17.4              186.0       3800.0  2007
#> 2            40.3           18.0              195.0       3250.0  2007

# 列名に 'length' を含む列を除外
print(py4st.filtering_out(penguins, contains = 'length'))
#>   species     island  bill_depth_mm  body_mass_g     sex  year  female
#> 0  Adelie  Torgersen           18.7       3750.0    male  2007       0
#> 1  Adelie  Torgersen           17.4       3800.0  female  2007       1
#> 2  Adelie  Torgersen           18.0       3250.0  female  2007       1

# 列名が 'bill' から始まる列を除外
print(py4st.filtering_out(penguins, starts_with = 'bill'))
#>   species     island  flipper_length_mm  body_mass_g     sex  year  female
#> 0  Adelie  Torgersen              181.0       3750.0    male  2007       0
#> 1  Adelie  Torgersen              186.0       3800.0  female  2007       1
#> 2  Adelie  Torgersen              195.0       3250.0  female  2007       1

# 列名が '_mm' で終わる列を除外
print(py4st.filtering_out(penguins, ends_with = '_mm'))
#>   species     island  body_mass_g     sex  year  female
#> 0  Adelie  Torgersen       3750.0    male  2007       0
#> 1  Adelie  Torgersen       3800.0  female  2007       1
#> 2  Adelie  Torgersen       3250.0  female  2007       1

pd.DataFrame を使用する場合、axis = 'index' を指定することで、index に基づく行の除外を行うことができます。

df = pd.DataFrame(
    {'x': [1, 2, 3, 4]}, 
    index=['keep', 'drop_me', 'drop_us', 'save']
    )

print(py4st.filtering_out(
  df, starts_with = 'drop', axis = 'index'
  ))
#>       x
#> keep  1
#> save  4

注意 Notes

axis='index' による行を対象とするフィルタリングは、インデックスの存在に依存します。したがって、pd.DataFrame 以外の行ラベルをもたない DataFrame バックエンドでは、このオプションは利用できません。


Return to Function reference.