PandasのDataFrameをフィルタする

# はじめに
PansdasのDataFrameで取得した値をExcelのフィルタのように特定の列の特定の値でフィルタする方法をまとめてみた。

 # 使うデータの例
 東証の上場銘柄のリストを使ってみる。

 https://www.jpx.co.jp/markets/statistics-equities/misc/01.html

 ここから、エクセル形式```data_j.xlsx```でデータ取得できる。下記のようなデータ。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299802/cf170f4c-7348-2335-45db-805b8a82c207.png)

# 目次
+ [先頭、終端から数行取得フィルタする。](#先頭終端から数行取得フィルタする)
+ [特定の列のデータを取得する。](#特定の列のデータを取得する)
+ [特定の値からフィルタする。](#特定の値からフィルタする)


## 先頭、終端から数行取得フィルタする。
文法|意味
---|---
df.head(行数)|先頭から指定した行数
df.tail(行数)|終端から指定した行数

```python:example.py
import pandas as pd

df = pd.read_excel('data_j.xls')

# 先頭5行-------------------
df_filter = df.head(5)
print(df_filter)

#          日付   コード                                   銘柄名     市場・商品区分 33業種コード  33業種区分 17業種コード 17業種区分 規模コード           規模区分
# 0  20240731  1301                                    極洋  プライム（内国株式）      50  水産・農林業       1     食品     7  TOPIX Small 2
# 1  20240731  1305                ｉＦｒｅｅＥＴＦ　ＴＯＰＩＸ（年１回決算型）     ETF・ETN       -       -       -      -     -              -
# 2  20240731  1306               ＮＥＸＴ　ＦＵＮＤＳ　ＴＯＰＩＸ連動型上場投信     ETF・ETN       -       -       -      -     -              -
# 3  20240731  1308                     上場インデックスファンドＴＯＰＩＸ     ETF・ETN       -       -       -      -     -              -
# 4  20240731  1309  ＮＥＸＴ　ＦＵＮＤＳ　ＣｈｉｎａＡＭＣ・中国株式・上証５０連動型上場投信     ETF・ETN       -       -       -      -     -              -

# 終端5行--------------------
df_filter = df.tail(5)
print(df_filter)

#             日付   コード    銘柄名       市場・商品区分 33業種コード 33業種区分 17業種コード 17業種区分 規模コード           規模区分
# 4378  20240731  9991   ジェコス    プライム（内国株式）    6050    卸売業      13  商社・卸売     7  TOPIX Small 2
# 4379  20240731  9993   ヤマザワ  スタンダード（内国株式）    6100    小売業      14     小売     7  TOPIX Small 2
# 4380  20240731  9994    やまや  スタンダード（内国株式）    6100    小売業      14     小売     7  TOPIX Small 2
# 4381  20240731  9996  サトー商会  スタンダード（内国株式）    6050    卸売業      13  商社・卸売     -              -
# 4382  20240731  9997   ベルーナ    プライム（内国株式）    6100    小売業      14     小売     6  TOPIX Small 1

```

[戻る](#目次)

## 特定の列のデータを取得する。
文法|意味
---|---
df['列名']|1列取得。
df[['列名1','列名2',...]]|複数列取得。列名をリストで指定。
列指定の上で、 ```.head()```や```.tail()```も使える。

```python:example.py
import pandas as pd

df = pd.read_excel('data_j.xls')

# 1列-------------
df_filter = df['コード']
print(df_filter)

# 0       1301
# 1       1305
# 2       1306
# 3       1308
# ...
# Name: コード, Length: 4383, dtype: object

# 複数列----------
df_filter = df[['コード','銘柄名']]
print(df_filter)

#        コード                                   銘柄名
# 0     1301                                    極洋
# 1     1305                ｉＦｒｅｅＥＴＦ　ＴＯＰＩＸ（年１回決算型）
# 2     1306               ＮＥＸＴ　ＦＵＮＤＳ　ＴＯＰＩＸ連動型上場投信
# 3     1308                     上場インデックスファンドＴＯＰＩＸ
# ...
# [4383 rows x 2 columns]
```
[戻る](#目次)


## 特定の値からフィルタする。
```df.query()```等を使うと、特定の値でフィルタすることができる。

文法|意味
---|---
df.query('A > 3000')|A列で値が3000以上
df[df['A'].isin(['a','b'])]|A列が'a'か'b'の文字列
df[df['A'].str.contains('a')]|A列で'a'を含む文字列
df[df['A'].str.endswith('a')]|A列で'a'で終わるの文字列
df[df['A'].str.startswith('a')]|A列で'a'で始まるの文字列
df[df['A'].str.match('...')]|A列で3文字の文字列(正規表現)

```python:example.py
import pandas as pd

df = pd.read_excel('data_j.xls')

# '市場・商品区分'列に'株式'という文字が含まれる
df_filter = df[df['市場・商品区分'].str.contains('株式')]
print(df_filter)

#             日付   コード                銘柄名       市場・商品区分 33業種コード  33業種区分 17業# 種コード        17業種区分 規模コード           規模区分
# 0     20240731  1301                 極洋    プライム（内国株式）      50  水産・農林業       1            食品     7  TOPIX Small 2
# 5     20240731  130A  Ｖｅｒｉｔａｓ　Ｉｎ　Ｓｉｌｉｃｏ    グロース（内国株式）    3250     医薬品       5           医薬品     -              -
# 19    20240731  1332               ニッスイ    プライム（内国株式）      50  水産・農林業       1            食品     4   TOPIX Mid400
# 20    20240731  1333             マルハニチロ    プライム（内国株式）      50  水産・農林業       1            食品     4   TOPIX Mid400
# ...
# [3842 rows x 10 columns]



# '市場・商品区分'列に'プライム（内国株式'か'グロース（内国株式）'が含まれる
df_filter = df[df['市場・商品区分'].isin(['プライム（内国株式）','グロース（内国株式）'])]
print(df_filter)

#             日付   コード                銘柄名     市場・商品区分 33業種コード  33業種区分 17業種コード        17業種区分 規模コード           規模区分
# 0     20240731  1301                 極洋  プライム（内国株式）      50  水産・農林業       1            食品     7  TOPIX Small 2
# 5     20240731  130A  Ｖｅｒｉｔａｓ　Ｉｎ　Ｓｉｌｉｃｏ  グロース（内国株式）    3250     医薬品       5           医薬品     -              -
# 19    20240731  1332               ニッスイ  プライム（内国株式）      50  水産・農林業       1            食品     4   TOPIX Mid400
# 20    20240731  1333             マルハニチロ  プライム（内国株式）      50  水産・農林業       1            食品     4   TOPIX Mid400
# 31    20240731  135A     ＶＲＡＩＮ　Ｓｏｌｕｔｉｏｎ  グロース（内国株式）    5250  情報・通信業      10  情報通信・サ ービスその他     -              -
# ...
# [2234 rows x 10 columns]

```
[戻る](#目次)