0. はじめに
タイトルだけでは何をしたいか伝わりきらないと思いますが、
以下のような状況での対応方法について私なりの考えを投稿させていただきます。
- 製品の性能を画像から予測したい
- 一つの製品に対して複数個所の画像を取得している
- 上記の複数の画像データと製品を紐づけるための管理テーブルを準備する
- 上記テーブルは記入の負担を下げるために、横持ちのデータにしたい
- 横持ち⇒縦持ちの変換を毎回全データに対して行うと負荷が高くなるため、変換した結果を保存し、次回の変換時には未対応のIDのみを処理する
1. 流れ
処理の流れは以下の通りです
- 横持ちのID対応表を読み込み(htable)
- 縦持ちに変換済みのID対応表を読み込み(vtable)
- 縦持ちに変換されていない行のみを選択
- 上記で選択した行をループ処理で一行ずつ縦持ちに変換
2. 関数の準備
処理4の関数を準備します
get_idx_corr_df.py
def get_idx_corr_df(sr,
idx_col_name,
root_col_name,
start_col_name, end_col_name,
sep=''):
"""
製品IDと複数の画像IDを対応させる
Parameters
----------
sr : Series.
idx_col_name : str, 製品IDのカラム名.
root_col_name : str, 枝番を除いた画像IDの情報を含むカラム名.
start_col_name : str, 数字で指定された枝番群の最小値を格納したカラム名.
end_col_name : str, 数字で指定された枝番群の最大値を格納したカラム名.
sep : str, idxと枝番のセパレータ.
Return
------
idx_col_df : DataFrame, idxの対応表(縦持ち)
"""
idx_list = []
for i in range(sr[start_col_name], sr[end_col_name]+1):
idx_list.append(sr[root_col_name] + f'{sep}{i}')
idx_corr_df = pd.DataFrame(idx_list)
idx_corr_df.index = [sr[idx_col_name]]*len(idx_corr_df)
return idx_corr_df
3. 実行
① 以下のような二つのテーブルを読み込みます
htable:画像を取得した際に対応表を記入
Product-ID | Image-ID_root | Image-ID_branch-start | Image-ID_branch-end |
---|---|---|---|
p1 | i1 | 1 | 3 |
p2 | i2 | 1 | 2 |
p3 | i3 | 1 | 4 |
vtable:htableを縦持ちに変換した結果を格納
Product-ID | Image-ID |
---|---|
p1 | i1_1 |
p1 | i1_2 |
p1 | i1_3 |
読み込み
htable = pd.read_excel('./htable.xlsx')
vtable = pd.read_excel('./vtable.xlsx')
② htableからvtableに変換されていない行を抽出する
行の選択
already_idx_list = vtable['Product-ID'].unique()
htable_select = htable[~htable['Product-ID'].isin(already_idx_list)]
③ htable_selectを一行ずつ読み込んでget_idx_corr_dfを実行する
変換
## 格納用に準備
all_corr_df = pd.DataFrame()
for i in range(len(htable_select)):
## 行を抽出
sr = htable_select.iloc[i, :]
## 関数を実行
corr_df = get_idx_corr_df(sr,
'Product-ID',
'Image-ID_root',
'Image-ID_branch-start', 'Image-ID_branch-end',
'_')
## 格納
all_corr_df = pd.concat([all_corr_df, corr_df], axis=0)
④ vtableを上書き
上書き
## 形を整える
all_corr_df.columns = ['Image-ID']
all_corr_df.insert(0, 'Product-ID', all_corr_df.index)
all_corr_df = all_corr_df.reset_index(drop=True)
## 元のデータと結合
vtable_update = pd.concat([vtable, all_corr_df], axis=0)
## 上書き
vtable_update.to_excel('./vtable.xlsx', index=None)
4. 最後に
もっと効率的な処理があると思います。
アイディアのある方がいらっしゃればコメントをお願いいたします。