🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1270閲覧

pythonでクロス抽出を行いたい

kknao

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/11 05:45

編集2019/12/13 09:37

前提・流れ

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2019/12/11 05:59

わからない部分はどこですか? CSVファイルを開く方法はわかりますか?
kknao

2019/12/11 06:04

元データをpandasで開く事は出来ました。 そこから先が分からず困っています…
Lhankor_Mhy

2019/12/11 06:06

流れ①ができない、ということですか? 例で言うと"A.csv"のファイル名は取得できているのですか?
kknao

2019/12/11 06:13

こういったサービスを使うのが初めてなので、説明不足で申し訳ありません。 ①から先が分からない状況です。 (①に関しては、if文を使う事は何となく分かるのですが…)
Lhankor_Mhy

2019/12/11 08:04

①について、ヘッダ行のリストは取得できていますか?
kknao

2019/12/11 12:55

ここまでは出来ました。 --------------------------------------- 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を行列の見出し行・列から探し出す ③対応する値を書きこむ ご教授宜しくお願い致します。
meg_

2019/12/11 13:40

「元データをpandasで開く事は出来ました。」このコードを質問に追記してください。
guest

回答1

0

aをグローバル変数として定義してはどうでしょうか?

投稿2019/12/13 11:25

meg_

総合スコア10736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kknao

2019/12/14 03:26

def gyoretsu内でglobal aとしてもif((np.any(a[:,0]== out_gate) and np.any(a[0,:]== in_gate))): NameError: name 'a' is not definedと同じエラーが出ます…
meg_

2019/12/14 04:01

スクリプトの先頭付近(df_newなどを定義しているところ)で変数aを定義してみてください。
kknao

2019/12/14 14:13

スクリプトの先頭でglobal aとしても変わらず同じnot definedのエラーが出てしまいます…
meg_

2019/12/15 04:02

関数の外でaを定義します。例えば、a=np.array([])としてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問