1
2

More than 1 year has passed since last update.

Pythonのpandasで、DataFrameの行を抽出するとき、自作の関数を使用する

Last updated at Posted at 2023-07-21

結論

DataFrameapply関数とラムダを組み合わせます。

前提

サンプルコードでは、下記の記事で公開しているcsvを使用させていただきました。csvからデータを取り込み、DataFrameを作成しております。

サンプルコード

.py
import pandas as pd

# 抽出条件として使用する関数
def condition(row):
    if row['name'] == 'Bob': return True
    if row['state'] == 'NY': return True
    if (row['state'] == 'CA') and (row['point'] == 70) : return True
    return False

def main():
    # ...
    # dfにはすでにDataFrame型のデータが入っているものとします。
    print('全データ')
    print(df)
    
    print()
    
    print('抽出後')
    # apply関数とラムダを組み合わせて、関数に条件を委ねる
    # 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
    print(df[df.apply(condition, axis=1)])

if __name__ == '__main__':
    main()

結果

全データ
      name  age state  point
0    Alice   24    NY     64
1      Bob   42    CA     92
2  Charlie   18    CA     70
3     Dave   68    TX     70
4    Ellen   24    CA     88
5    Frank   30    NY     57

抽出後
      name  age state  point
0    Alice   24    NY     64
1      Bob   42    CA     92
2  Charlie   18    CA     70
5    Frank   30    NY     57

関数の条件が適応されていることが分かります。

補足

サンプルコードにあったコード

.py
# apply関数とラムダを組み合わせて、関数に条件を委ねる
# 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
print(df[df.apply(condition, axis=1)])

これは、下記のコードを簡略したものです。

.py
# apply関数とラムダを組み合わせて、関数に条件を委ねる
# 「df.apply」と記述して1行の情報が全てほしい場合、axis=1が必要
print(df[df.apply(lambda row: condition(row), axis=1)])

@shiracamus さんに教えていただきました。ありがとうございます!

以上です。

参考

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2