0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonを用いて製品IDと複数の画像IDを対応させる方法(枝番を有するテーブルで紐づける)

Last updated at Posted at 2024-02-04

0. はじめに

タイトルだけでは何をしたいか伝わりきらないと思いますが、
以下のような状況での対応方法について私なりの考えを投稿させていただきます。

  • 製品の性能を画像から予測したい
  • 一つの製品に対して複数個所の画像を取得している
  • 上記の複数の画像データと製品を紐づけるための管理テーブルを準備する
  • 上記テーブルは記入の負担を下げるために、横持ちのデータにしたい
  • 横持ち⇒縦持ちの変換を毎回全データに対して行うと負荷が高くなるため、変換した結果を保存し、次回の変換時には未対応のIDのみを処理する

image.png

1. 流れ

処理の流れは以下の通りです

  1. 横持ちのID対応表を読み込み(htable)
  2. 縦持ちに変換済みのID対応表を読み込み(vtable)
  3. 縦持ちに変換されていない行のみを選択
  4. 上記で選択した行をループ処理で一行ずつ縦持ちに変換

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. 最後に

もっと効率的な処理があると思います。
アイディアのある方がいらっしゃればコメントをお願いいたします。

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?