JPEA申請の回し方をどうする
import numpy as np
import pandas as pd
import pathlib
サンプル作成
# サンプルデータを作成
data = np.random.randint(1, 100, (10, 5))
header = 'No id 謄本 同意書 共同名義人'.split()
df = pd.DataFrame(data, columns=header)
df['id'] = ['A' + str(i) for i in np.random.randint(100, 999, 10)]
df['No'] = [i for i in range(1, 11)]
df.iat[2,2], df.iat[4,4], df.iat[3,4] = np.nan, np.nan, np.nan
df
| No | id | 謄本 | 同意書 | 共同名義人 |
|---|
| 0 | 1 | A879 | 31.0 | 32 | 11.0 |
|---|
| 1 | 2 | A799 | 77.0 | 23 | 71.0 |
|---|
| 2 | 3 | A741 | NaN | 3 | 6.0 |
|---|
| 3 | 4 | A950 | 95.0 | 58 | NaN |
|---|
| 4 | 5 | A489 | 93.0 | 1 | NaN |
|---|
| 5 | 6 | A642 | 53.0 | 85 | 23.0 |
|---|
| 6 | 7 | A920 | 13.0 | 91 | 4.0 |
|---|
| 7 | 8 | A222 | 52.0 | 89 | 51.0 |
|---|
| 8 | 9 | A640 | 97.0 | 82 | 52.0 |
|---|
| 9 | 10 | A604 | 62.0 | 83 | 65.0 |
|---|
NaNをNoneへ置換
# NaNは辞書にすると文字列になるため、本来のNoneに変換しておく
df = df.replace([np.nan], [None])
df
[pandas]DataFrameのNaNをサクッとNoneに置き換える方法2つ | pixelbeat sandbox
| No | id | 謄本 | 同意書 | 共同名義人 |
|---|
| 0 | 1 | A879 | 31.0 | 32 | 11.0 |
|---|
| 1 | 2 | A799 | 77.0 | 23 | 71.0 |
|---|
| 2 | 3 | A741 | None | 3 | 6.0 |
|---|
| 3 | 4 | A950 | 95.0 | 58 | None |
|---|
| 4 | 5 | A489 | 93.0 | 1 | None |
|---|
| 5 | 6 | A642 | 53.0 | 85 | 23.0 |
|---|
| 6 | 7 | A920 | 13.0 | 91 | 4.0 |
|---|
| 7 | 8 | A222 | 52.0 | 89 | 51.0 |
|---|
| 8 | 9 | A640 | 97.0 | 82 | 52.0 |
|---|
| 9 | 10 | A604 | 62.0 | 83 | 65.0 |
|---|
a_id = df.iat[0, 1]
df_0 = df.query('id == @a_id')
df_0
| No | id | 謄本 | 同意書 | 共同名義人 |
|---|
| 0 | 1 | A879 | 31.0 | 32 | 11.0 |
|---|
値へ直接アクセスするには
print(df_0.iat[0,0])
print(df_0.iat[0,1])
print(df_0.iat[0,2])
print(df_0.iat[0,3])
1
A879
31.0
32
print(df.at[0,'id'])
print(df.at[0,'謄本'])
print(df.at[0,'同意書'])
print(df.at[0,'共同名義人'])
A879
31.0
32
11.0
辞書を作りたい
df0 = df.set_index('No')
df0
| id | 謄本 | 同意書 | 共同名義人 |
|---|
| No | | | | |
|---|
| 1 | A879 | 31.0 | 32 | 11.0 |
|---|
| 2 | A799 | 77.0 | 23 | 71.0 |
|---|
| 3 | A741 | None | 3 | 6.0 |
|---|
| 4 | A950 | 95.0 | 58 | None |
|---|
| 5 | A489 | 93.0 | 1 | None |
|---|
| 6 | A642 | 53.0 | 85 | 23.0 |
|---|
| 7 | A920 | 13.0 | 91 | 4.0 |
|---|
| 8 | A222 | 52.0 | 89 | 51.0 |
|---|
| 9 | A640 | 97.0 | 82 | 52.0 |
|---|
| 10 | A604 | 62.0 | 83 | 65.0 |
|---|
修正)転置せずとも、df.to_dict(orient=’index’) で出せる
# 転置しないとキー:{ }の形にならない
df1 = df0.T
df1
| No | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|
| id | A879 | A799 | A741 | A950 | A489 | A642 | A920 | A222 | A640 | A604 |
|---|
| 謄本 | 31.0 | 77.0 | None | 95.0 | 93.0 | 53.0 | 13.0 | 52.0 | 97.0 | 62.0 |
|---|
| 同意書 | 32 | 23 | 3 | 58 | 1 | 85 | 91 | 89 | 82 | 83 |
|---|
| 共同名義人 | 11.0 | 71.0 | 6.0 | None | None | 23.0 | 4.0 | 51.0 | 52.0 | 65.0 |
|---|
これが欲しかった!(辞書)
# これがほしかった! この正しいデータさえあれば自動投入が可能
# キーを何にするか。ここではNoにしている。
df_dict = df1.to_dict()
df_dict
{1: {'id': 'A879', '謄本': 31.0, '同意書': 32, '共同名義人': 11.0},
2: {'id': 'A799', '謄本': 77.0, '同意書': 23, '共同名義人': 71.0},
3: {'id': 'A741', '謄本': None, '同意書': 3, '共同名義人': 6.0},
4: {'id': 'A950', '謄本': 95.0, '同意書': 58, '共同名義人': None},
5: {'id': 'A489', '謄本': 93.0, '同意書': 1, '共同名義人': None},
6: {'id': 'A642', '謄本': 53.0, '同意書': 85, '共同名義人': 23.0},
7: {'id': 'A920', '謄本': 13.0, '同意書': 91, '共同名義人': 4.0},
8: {'id': 'A222', '謄本': 52.0, '同意書': 89, '共同名義人': 51.0},
9: {'id': 'A640', '謄本': 97.0, '同意書': 82, '共同名義人': 52.0},
10: {'id': 'A604', '謄本': 62.0, '同意書': 83, '共同名義人': 65.0}}
# もしidをキーにするならこうする。
df_2 = df.set_index('id')
display(df_2.T)
df_2.T.to_dict()
| id | A879 | A799 | A741 | A950 | A489 | A642 | A920 | A222 | A640 | A604 |
|---|
| No | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|
| 謄本 | 31.0 | 77.0 | None | 95.0 | 93.0 | 53.0 | 13.0 | 52.0 | 97.0 | 62.0 |
|---|
| 同意書 | 32 | 23 | 3 | 58 | 1 | 85 | 91 | 89 | 82 | 83 |
|---|
| 共同名義人 | 11.0 | 71.0 | 6.0 | None | None | 23.0 | 4.0 | 51.0 | 52.0 | 65.0 |
|---|
{'A879': {'No': 1, '謄本': 31.0, '同意書': 32, '共同名義人': 11.0},
'A799': {'No': 2, '謄本': 77.0, '同意書': 23, '共同名義人': 71.0},
'A741': {'No': 3, '謄本': None, '同意書': 3, '共同名義人': 6.0},
'A950': {'No': 4, '謄本': 95.0, '同意書': 58, '共同名義人': None},
'A489': {'No': 5, '謄本': 93.0, '同意書': 1, '共同名義人': None},
'A642': {'No': 6, '謄本': 53.0, '同意書': 85, '共同名義人': 23.0},
'A920': {'No': 7, '謄本': 13.0, '同意書': 91, '共同名義人': 4.0},
'A222': {'No': 8, '謄本': 52.0, '同意書': 89, '共同名義人': 51.0},
'A640': {'No': 9, '謄本': 97.0, '同意書': 82, '共同名義人': 52.0},
'A604': {'No': 10, '謄本': 62.0, '同意書': 83, '共同名義人': 65.0}}
# No1の「~」の数(=URL)は?
print(f"{df_dict[1]['謄本']=}")
print(f"{df_dict[1]['同意書']=}")
print(f"{df_dict[1]['共同名義人']=}")
df_dict[1]['謄本']=31.0
df_dict[1]['同意書']=32
df_dict[1]['共同名義人']=11.0
辞書ならセットで追加できる
# dicに新しい情報を追加することもできる
df_dict[3]['STATUS'] = "まだ"
df_dict[2]['STATUS'] = "中断"
df_dict[1]['STATUS'] = "完了"
{1: {'id': 'A879', '謄本': 31.0, '同意書': 32, '共同名義人': 11.0, 'STATUS': '完了'},
2: {'id': 'A799', '謄本': 77.0, '同意書': 23, '共同名義人': 71.0, 'STATUS': '中断'},
3: {'id': 'A741', '謄本': None, '同意書': 3, '共同名義人': 6.0, 'STATUS': 'まだ'},
4: {'id': 'A950', '謄本': 95.0, '同意書': 58, '共同名義人': None},
5: {'id': 'A489', '謄本': 93.0, '同意書': 1, '共同名義人': None},
6: {'id': 'A642', '謄本': 53.0, '同意書': 85, '共同名義人': 23.0},
7: {'id': 'A920', '謄本': 13.0, '同意書': 91, '共同名義人': 4.0},
8: {'id': 'A222', '謄本': 52.0, '同意書': 89, '共同名義人': 51.0},
9: {'id': 'A640', '謄本': 97.0, '同意書': 82, '共同名義人': 52.0},
10: {'id': 'A604', '謄本': 62.0, '同意書': 83, '共同名義人': 65.0}}
# 外側のループはこれ。※ 最初に NaN を None に変換しているので Noneの場合はスキップされる
for No, files in df_dict.items():
# この2つで入力実施
No = No
setsubi_id = files['id']
# Selenium 実行関数(入力)
# try:
# func()
# except Exception as ex:
# print(f'処理中断:{id=}', ex)
# sys.exit()
# Selenium 実行関数(添付)
# 以下で添付ファイルを乗り切る
path_tohon = files['謄本']
path_doisyo = files['同意書']
path_kyodo = files['共同名義人']
print(f'{No=}, {setsubi_id=}, {path_tohon=}, {path_doisyo=}, {path_kyodo=}')
if path_tohon:
print("添付を実行(謄本)", path_tohon)
if path_doisyo:
print("添付を実行(同意書)", path_doisyo)
if path_kyodo:
print("添付を実行(共同名義人)", path_kyodo)
# Selenium 実行関数(申請)
# 申請番号を記録、ループに戻る
No=1, setsubi_id='A879', path_tohon=31.0, path_doisyo=32, path_kyodo=11.0
添付を実行(謄本) 31.0
添付を実行(同意書) 32
添付を実行(共同名義人) 11.0
No=2, setsubi_id='A799', path_tohon=77.0, path_doisyo=23, path_kyodo=71.0
添付を実行(謄本) 77.0
添付を実行(同意書) 23
添付を実行(共同名義人) 71.0
No=3, setsubi_id='A741', path_tohon=None, path_doisyo=3, path_kyodo=6.0
添付を実行(同意書) 3
添付を実行(共同名義人) 6.0
No=4, setsubi_id='A950', path_tohon=95.0, path_doisyo=58, path_kyodo=None
添付を実行(謄本) 95.0
添付を実行(同意書) 58
No=5, setsubi_id='A489', path_tohon=93.0, path_doisyo=1, path_kyodo=None
添付を実行(謄本) 93.0
添付を実行(同意書) 1
No=6, setsubi_id='A642', path_tohon=53.0, path_doisyo=85, path_kyodo=23.0
添付を実行(謄本) 53.0
添付を実行(同意書) 85
添付を実行(共同名義人) 23.0
No=7, setsubi_id='A920', path_tohon=13.0, path_doisyo=91, path_kyodo=4.0
添付を実行(謄本) 13.0
添付を実行(同意書) 91
添付を実行(共同名義人) 4.0
No=8, setsubi_id='A222', path_tohon=52.0, path_doisyo=89, path_kyodo=51.0
添付を実行(謄本) 52.0
添付を実行(同意書) 89
添付を実行(共同名義人) 51.0
No=9, setsubi_id='A640', path_tohon=97.0, path_doisyo=82, path_kyodo=52.0
添付を実行(謄本) 97.0
添付を実行(同意書) 82
添付を実行(共同名義人) 52.0
No=10, setsubi_id='A604', path_tohon=62.0, path_doisyo=83, path_kyodo=65.0
添付を実行(謄本) 62.0
添付を実行(同意書) 83
添付を実行(共同名義人) 65.0
# もし関数がよいなら
def attach_files(No_or_setsubi_id):
files = df_dict[No_or_setsubi_id]
setsubi_id = files['id']
# 以下で添付ファイルを乗り切る
path_tohon = files['謄本']
path_doisyo = files['同意書']
path_kyodo = files['共同名義人']
return path_tohon, path_doisyo, path_kyodo
attach_files(No_or_setsubi_id=1)
(31.0, 32, 11.0)
df_rev = pd.DataFrame(df_dict).T
df_rev
| id | 謄本 | 同意書 | 共同名義人 | STATUS |
|---|
| 1 | A879 | 31.0 | 32 | 11.0 | 完了 |
|---|
| 2 | A799 | 77.0 | 23 | 71.0 | 中断 |
|---|
| 3 | A741 | None | 3 | 6.0 | まだ |
|---|
| 4 | A950 | 95.0 | 58 | None | NaN |
|---|
| 5 | A489 | 93.0 | 1 | None | NaN |
|---|
| 6 | A642 | 53.0 | 85 | 23.0 | NaN |
|---|
| 7 | A920 | 13.0 | 91 | 4.0 | NaN |
|---|
| 8 | A222 | 52.0 | 89 | 51.0 | NaN |
|---|
| 9 | A640 | 97.0 | 82 | 52.0 | NaN |
|---|
| 10 | A604 | 62.0 | 83 | 65.0 | NaN |
|---|
df_rev.to_excel('df_rev.xlsx')