はじめに
PansdasのDataFrameで取得した値をExcelのフィルタのように特定の列の特定の値でフィルタする方法をまとめてみた。
使うデータの例
東証の上場銘柄のリストを使ってみる。
ここから、エクセル形式data_j.xlsx
でデータ取得できる。下記のようなデータ。
目次
先頭、終端から数行取得フィルタする。
文法 | 意味 |
---|---|
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]