# はじめに
Python PandasライブラリでExcelの表題「件名」列に「中計」と書いてある行番号を全て探す
場合のメモを書き留めておきます。
結論
pandas.DataFrameオブジェクト.reset_index().query( '件名 == "中計"' ).index
と記述します。これで表題「件名」列に「中計」と書いてある行番号の配列を得ることができます。具体的には以下のように記述します。
具体例
list中計行 = list( df請求一覧.reset_index().query( '件名 == "中計"' ).index )
前提条件
- Excelシートは
ベースパス
の請求対象フォルダ
の年月フォルダ
の出力フォルダ名
内のExcelブック請求一覧ファイル名
内のシートとします - 表題「件名」列に「中計」と書いてあるExcelシートをPandasのDataFrame
df請求一覧
に格納します
していること
-
reset_index()
でdf請求一覧
の行番号に当たるインデックスを初期化します -
query()
メソッドで検索条件として'件名 == "中計"'
を指定します - この
query()
メソッドのindex
プロパティを得ます。これが件名」列に「中計」の行番号です - これらの行番号が複数あるので、
list()
関数で配列化し、list中計行
配列に格納します
実装例
念のためにご参考までに、上記の具体例を使う実装例を示します。
マージクするためのクラスたち
Excelシートの表題行(ヘッダ行)以下をPandasのDataFrameに格納指定ます
merge.py
import pandas as pd
import os
import setting
class Read:
def 請求一覧( 入力内容, listメッセージ ):
請求一覧パス = \
os.path.join( \
入力内容.get( 'ベースパス' ), \
入力内容.get( '請求対象フォルダ名' ), \
入力内容.get( '年月フォルダ名' ), \
入力内容.get( '出力フォルダ名' ), \
入力内容.get( '請求一覧ファイル名' ) \
)
book請求一覧 = pd.ExcelFile( 請求一覧パス )
df請求一覧 = book請求一覧.parse( \
book請求一覧.sheet_names[0], \
header=setting.Info.請求明細.get( 'ヘッダ行' ) - 1 \
)
# 省略
return( df請求一覧 )
class 請求一覧:
def 中計行をさがす( df請求一覧 ):
list中計行 = []
list中計行 = list( df請求一覧.reset_index().query( '件名 == "中計"' ).index )
print( "■list中計行 = ", list中計行 )
利用するクラス
PythonのWebフレームワークresponderのとあるクラスのPOSTメソッドで利用しています
run.py
import responder
import merge
# 省略
@api.route("/top")
class top:
# 省略
async def on_post( self, req, resp ):
data = await req.media()
# 省略
merge.請求一覧.中計行をさがす( merge.Read.請求一覧( 入力内容, listメッセージ ) )
# 省略
return
# 省略
もろもろ設定クラス
setting.py
class Info
#省略
パス = {
"ベース": r"\\hoge\\foo\なんとか\かんとか"
,
"請求対象フォルダ名": "請求対象"
,
"年月フォルダ名": "yyyyMM分"
,
"出力フォルダ名": "請求一覧"
,
"請求一覧ファイル名": "なんとかかんとか.xlsx"
,
# 省略
}
# 省略
請求明細 = {
"ヘッダ行": 9 ,
"データ開始列": 1 ,
}