レースファイルの馬名から馬名ファイルにあるhorseIDを取り出すコードを作成しました。
書いた本人にしかわからない内容ですが、pandasを扱って案の定苦戦したので記録を残しておきます。
手順としてはレースファイルから各着順の馬名を取り出し年齢から誕生年(満年齢の場合はレース年-年齢)を算出。誕生年の馬名リストからhorseIDを取得し、レースファイルの最後列に追記します。
データフレームはあくまでも配列であり一次元であってもリストとして扱わないことを今後は肝に銘じます。
import glob
import pandas as pd
import csv,re
# 1986年から2020年のレースファイルにhorseID列を追加する
for year in range(1986,2021):
for f in glob.glob(f'/horse_racing/race_result_mas/{year}/*/*/*.csv'):
file_new = f.split('race_result_mas/')[0] + 'race_result/' + f.split('race_result_mas/')[1]
with open (f, mode="r", encoding="shift_jis") as f1:
with open(file_new, mode="w", encoding="shift_jis") as f2:
writer = csv.writer(f2)
for i,row in enumerate(csv.reader(f1)):
if i != 0:
if year >=2001: # 満年齢
birthyear = int(year) - int(re.sub("\\D", "", row[4]))
else: # 2000年以前は数え年
birthyear = int(year) - int(re.sub("\\D", "", row[4])) + 1
# 誕生年馬名ファイル
namefile = f'/horse_racing/horse/horse{birthyear}.csv'
try:
df = pd.read_csv(namefile,encoding="shift_jis")
except:
horseID = '1985年以前'
else:
# 各行の馬名セルにレースファイルの馬名を含む場合にTrueとする縦向き配列を作成
b_array = df[df.columns[1]].str.contains(row[3])
# ブール値の横向き配列として取り出しリスト化
b_array_v = b_array.values.tolist()
# Trueのインデックス値を算出しhorseIDを取得
try:
i = b_array_v.index(True)
except:
horseID = '該当なし'
else:
print(f'index {i}')
horseID = df.iloc[i,0]
print(f'{row[3]} {birthyear} {horseID}')
rows = row[0:22] + [horseID]
writer.writerow(rows)
else: # タイトル行(0行目)
rows = row[0:22] + ['horseID']
writer.writerow(rows)