いつも勉強させていただいてます。
AnacondaのPython3の環境下で以下のプログラムを実行しています。
カレントディレクトリに以下のようなカラムが2列あるtest.csvがあります。
各columnのindex0に'sample1','sample2'、index1以降にデータが247個入っています。
まず、test.csvのcolumn0,1をそれぞれの数値がそれぞれのカラムに入るように11列に分け、index1-247をそれぞれsample1.csv,sample2.csv...sample247.csvとして保存します。
0
0 sample1
1 VAL H 1 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
2 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
3 VAL H 3 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
4 VAL H 4 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
... ... .. .. ... ... ... ... ... ... ... ... ... ...
3 VAL H 246 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
4 VAL H 247 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
sample*.csvの左端に以下のtest.csvのindex0の2列を縦に挿入。
0 1
0
NaN sample1 sample2
以下のような形になります。
0 1 2 3 4 5 6 9 10 11 12 13
1 sample1 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
2 sample2 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
この一つのCSVファイル中でindex2のカラム4~13の値がindex1にあるsample1のそれぞれの数値と異なる数値を含む行のみ取り出し、この処理をカレントディレクトリにあるsample.csvファイルすべてで行い、一つのファイルで出力したいと思っています。
以下のようなプログラムを作成し、目的の値は得られましたが、時間がかかりました。
import pandas as pd df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0) for t in range(1,3): sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0) test_id=pd.concat([df_test.iloc[0,:],sample_files],axis=1) df_frame=pd.DataFrame(test_id.iloc[0,:]).T for i in range(1,247): df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:] df_diff_id=pd.concat([test_id.iloc[i,:4],df_diff]) for k in range(10): if df_diff[k] !=0.0: df_frame=df_frame.append(df_diff,ignore_index=True) df_frame_unique=df_frame.drop_duplicates() df_frame_unique.to_csv("result.csv",sep=",") print(df_frame_unique)
そこで以下の様にプログラムを修正し、目的のものが得られました。
df_result=pd.DataFrame() import pandas as pd df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0) for t in range(1,3): sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0) test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1) df_frame=pd.DataFrame(test_id.iloc[0,:]).T for i in range(1,247): df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:] df_diff_id=pd.concat([df_test.iloc[i,:4],df_diff]) if df_diff.sum() ! = 0: df_frame=df_frame.append(df_diff,ignore_index=True) df_result=pd.concat([df_result,df_frame]) print(df_result) df_result.to_csv("result.csv",sep=",")
最初のプログラムで時間がかかり過ぎたのと一つのファイルで出力できていなかったので質問させて頂きましたが、質問を修正しているうちに2つ目のプログラムでよいことに気付きました。
ですが、折角ですので勉強のため、修正点やほかにもっといい方法があれば教えてください
ご指摘いただいたようにファイル出力をループの外にだして以下になりました。
df_result=pd.DataFrame() import pandas as pd df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0) for t in range(1,3): sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0) test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1) df_frame=pd.DataFrame(test_id.iloc[0,:]).T for i in range(1,247): df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:] df_diff_id=pd.concat([df_test.iloc[i,:4],df_diff]) if df_diff.sum() != 0: df_frame=df_frame.append(df_diff,ignore_index=True).drop_duplicates() df_result=pd.concat([df_result,df_frame]) print(df_result) df_result.to_csv("result.csv",sep=",")
ちなみに処理時間は以下の様でした。
第一ループ内で出力(for i in range(1,247)と同じインデント)
elapsed time:19.02880597114563
第2ループ内で出力(df_result=pd.concat...と同じインデント)
elapsed time:4.529508113861084
ループ外で出力
elapsed time:2.024280071258545
回答1件
あなたの回答
tips
プレビュー