1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PandasのDataFrameをフィルタする

Last updated at Posted at 2024-08-31

はじめに

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

使うデータの例

東証の上場銘柄のリストを使ってみる。

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

image.png

目次

先頭、終端から数行取得フィルタする。

文法 意味
df.head(行数) 先頭から指定した行数
df.tail(行数) 終端から指定した行数
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                iFreeETF TOPIX(年1回決算型)     ETF・ETN       -       -       -      -     -              -
# 2  20240731  1306               NEXT FUNDS TOPIX連動型上場投信     ETF・ETN       -       -       -      -     -              -
# 3  20240731  1308                     上場インデックスファンドTOPIX     ETF・ETN       -       -       -      -     -              -
# 4  20240731  1309  NEXT FUNDS ChinaAMC・中国株式・上証50連動型上場投信     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()も使える。
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                iFreeETF TOPIX(年1回決算型)
# 2     1306               NEXT FUNDS TOPIX連動型上場投信
# 3     1308                     上場インデックスファンドTOPIX
# ...
# [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文字の文字列(正規表現)
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  Veritas In Silico    グロース(内国株式)    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  Veritas In Silico  グロース(内国株式)    3250     医薬品       5           医薬品     -              -
# 19    20240731  1332               ニッスイ  プライム(内国株式)      50  水産・農林業       1            食品     4   TOPIX Mid400
# 20    20240731  1333             マルハニチロ  プライム(内国株式)      50  水産・農林業       1            食品     4   TOPIX Mid400
# 31    20240731  135A     VRAIN Solution  グロース(内国株式)    5250  情報・通信業      10  情報通信・サ ービスその他     -              -
# ...
# [2234 rows x 10 columns]

戻る

1
1
0

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?