filtering_out
データフレームの行と列の除外
概要
pandas の DataFrame.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
data:IntoFrameT(必須)
入力データ。narwhals が受け入れ可能な DataFrame 互換オブジェクト
(例:pandas.DataFrame、polars.DataFrame、pyarrow.Table)を指定できます。*args(str / list[str] / narwhals.Expr / narwhals.Selector)
データフレームから除外したい列を指定します。指定方法は次のとおりです。- 列名(例:
"x") - 列名のリスト(例:
["x", "y"]) - narwhals の式(
Expr)(例:nw.col("x")) *axis = 'columns'の場合のみ - narwhals の
Selector(例:ncs.numeric())*axis = 'columns'の場合のみ
- 列名(例:
contains:str
列名(行名)の検索に使用する文字列。内部で使用しているpandas.Series.str.containsに渡され、指定された文字列を列名(行名)に含む列(行)を除外します。starts_with:str
列名(行名)の検索に使用する文字列。内部で使用しているpandas.Series.str.startswithに渡され、指定された文字列で列名(行名)が始まる列(行)を除外します。ends_with:str
列名(行名)の検索に使用する文字列。内部で使用している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 1pd.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 バックエンドでは、このオプションは利用できません。
