前提・流れ
pythonでクロス抽出を行いたい
(データ内のIDを取り出し、対応する行列から結果を抽出したい)
元データ.csv
year,month,day,ID1,ID2,A,B,C,D,E,F,G,H,I [2018,10,15,04055,01410,1,0,0,0,0,0,0,0,0], [2018,10,02,01221,01064,1,0,0,0,0,0,0,0,0], [2018,10,03,01062,01202,1,0,0,0,0,0,0,0,0]
対応する行列
EX)A.csv
01410 01603 01576 01221 01202 04055 100 68.5 10.5 56.9 50.9 01064 78.9 86.4 64.0 42.3 20.4 01062 78.1 68.7 64.2 56.4 85.6
流れ
①元データのAからIの中で、1になっているcsvを開く
ex)1行目のデータならば、Aが1になっているので、A.csvを開く
②対応するID1とID2を見つけ、行列の対応する値をデータに埋め込む
ex)1行目のデータならば、ID1が'04055'、ID2が'01410'なので100をデータに埋め込む
実現したいこと
以下の様なcsvファイルを作りたいと考えています。
year,month,day,ID1,ID2,A,B,C,D,E,F,G,H,I,gyoretsu [2018,10,15,04055,01410,1,0,0,0,0,0,0,0,0,100], [2018,10,02,01221,01064,1,0,0,0,0,0,0,0,0,42.3], [2018,10,03,01062,01202,1,0,0,0,0,0,0,0,0,85.6]
試したこと(コード)
import pandas as pd import time import csv import numpy as np df_new = open(r'new.csv','a',newline="") csvWriter = csv.writer(df_new) listData = ['year','month','day','ID1','ID2','A,'B','C','D','E','F','G','H','I','gyoretsu'] csvWriter.writerow(listData) gyoretsu=[] start=time.time() with open(r'元データ.csv','r')as df: num = 0 for line in df: num += 1 if(num == 1): print("読み込み開始") else: if(num%100 == 0): print("num={0},".format(num),end="") elapsed_time = time.time() - start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") line = line.rstrip('\n').split(',') if(line[16]==1): a = np.loadtxt(r'A.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[17]==1): a= np.loadtxt(r'B.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[18]==1): a= np.loadtxt(r'C.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[19]==1): a= np.loadtxt(r'D.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[20]==1): a= np.loadtxt(r'E.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[21]==1): a= np.loadtxt(r'F.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[22]==1): a= np.loadtxt(r'G.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[23]==1): a= np.loadtxt(r'H.csv', delimiter=',', dtype='object',encoding='utf-8') elif(line[24]==1): a= np.loadtxt(r'I.csv', delimiter=',', dtype='object',encoding='utf-8') def gyoretsu(ID1,ID2): if((np.any(a[:,0]== ID1) and np.any(a[0,:]== ID2))): gyoretsu.append(a[np.where(a[:,0]== ID1 ),np.where(a[0,:]== ID2)]) elif((np.any(a[0,:]== ID1) and np.any(a[:,0]==ID2))): gyoretsu.append(a[np.where(a[0:,]== ID1),np.where(a[:,0]== ID2)]) else: gyoretsu.append(0) return gyoretsu append_line = gyoretsu(line[4],line[5]) if(sum(append_line) != 0): csvWriter.writerow(line + append_line) df_new.close()
エラーメッセージ
if((np.any(a[:,0]== ID1) and np.any(a[0,:]== ID2))): NameError: name 'a' is not defined
コードは出来たんですが、エラーの対処法が分かりません。
aは定義出来ている気がするんですが…
補足情報(FW/ツールのバージョンなど)
python3.7
Windows10
わからない部分はどこですか?
CSVファイルを開く方法はわかりますか?
元データをpandasで開く事は出来ました。
そこから先が分からず困っています…
流れ①ができない、ということですか?
例で言うと"A.csv"のファイル名は取得できているのですか?
こういったサービスを使うのが初めてなので、説明不足で申し訳ありません。
①から先が分からない状況です。
(①に関しては、if文を使う事は何となく分かるのですが…)
①について、ヘッダ行のリストは取得できていますか?
ここまでは出来ました。
---------------------------------------
with open('元データ.csv','r') as target_file:
for line in target_file:
line = line.rstrip('\n').split(',')
if(line[5]=='1'):
print(line[3:5])
----------------------------------------
※この後に
①A.csvを開く
②line[3:5]で取得したID1とID2を行列の見出し行・列から探し出す
③対応する値を書きこむ
ご教授宜しくお願い致します。
「元データをpandasで開く事は出来ました。」このコードを質問に追記してください。