質問編集履歴

2

ファイルの変更とプログラム修正しました。

2019/04/23 12:28

投稿

kak
kak

スコア27

test CHANGED
File without changes
test CHANGED
@@ -4,45 +4,49 @@
4
4
 
5
5
 
6
6
 
7
- カレントディレクトリに以下のようなtest*.csvが270個あります。
7
+ カレントディレクトリに以下のようなカラムが2列あるtest.csvがあります。
8
+
8
-
9
+ 各columnのindex0に'sample1','sample2'、index1以降にデータが247個入っています。
10
+
9
-
11
+ まず、test.csvのcolumn0,1をそれぞれの数値がそれぞれのカラムに入るように11列に分け、index1-247をそれぞれsample1.csv,sample2.csv...sample247.csvとして保存します。
12
+
13
+
14
+
10
-
15
+ 0
16
+
11
- 0 1 2 3 4 5 6 7 8 9 10 11 12
17
+ 0 sample1
12
-
18
+
13
- 1 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
19
+ 1 VAL H 1 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
14
20
 
15
21
  2 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
16
22
 
17
- 3 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
23
+ 3 VAL H 3 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
18
-
24
+
19
- 4 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
25
+ 4 VAL H 4 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
20
26
 
21
27
 
22
28
 
23
29
  ... ... .. .. ... ... ... ... ... ... ... ... ... ...
24
30
 
25
-
26
-
27
- 1888 VAL H 2 79.91 52.8 53.56 46.9 26.35 70.9 53.56 46.4 26.35 73.3
28
-
29
- 1889 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
31
+ 3 VAL H 246 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
30
-
32
+
31
- 1890 VAL H 2 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
33
+ 4 VAL H 247 103.30 68.2 76.95 67.3 26.35 70.9 76.95 66.6 26.35 73.3
32
-
33
-
34
-
35
-
36
-
34
+
35
+
36
+
37
+
38
+
39
+
40
+
37
- sample*.csvの左端に以下のtest_list.csvのインデックス01890列を縦に挿入。
41
+ sample*.csvの左端に以下のtest.csvのindex02列を縦に挿入。
38
-
39
-
40
-
42
+
43
+
44
+
41
- 1 2 ... 1889 1890
45
+ 0 1
46
+
42
-
47
+ 0
48
+
43
- 0 ...
49
+ NaN sample1 sample2
44
-
45
- NaN sample1 sample1000 ... sample99 sample8
46
50
 
47
51
 
48
52
 
@@ -56,27 +60,17 @@
56
60
 
57
61
  1 sample1 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
58
62
 
59
- 2 sample1000 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
63
+ 2 sample2 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
60
-
61
- 3 sample236 ASP H 112 -0.59 -0.4 ... -0.51 -1.3 -0.08 -0.1 -0.51
64
+
62
-
63
- ... ... .. .. ... ... ... ... ... ... ... ... ... ...
65
+
64
-
65
- 1888 sample237 ASP H 112 -15.02 -10.7 ... -15.03 -39.8 0 0 -15.02
66
+
66
-
67
- 1889 sample99 ASP H 112 -13.12 -9.3 ... -12.46 -33 -0.67 -1.3 -12.45
67
+
68
-
69
- 1890 sample9 ASP H 112 -17.71 -12.6 ... -17.07 -45.2 -0.64 -1.3 -17.07
68
+
70
-
71
-
72
-
73
-
74
-
69
+
70
+
75
- この一つのCSVファイル中でindex2~1890のカラム4~13の値がindex1にあるsample1のそれぞれの数値と異なる数値を含む行のみ取り出し、この処理をカレントディレクトリにある270個のsample.csvファイルすべてで行い、一つのファイルで出力したいと思っています。
71
+ この一つのCSVファイル中でindex2のカラム4~13の値がindex1にあるsample1のそれぞれの数値と異なる数値を含む行のみ取り出し、この処理をカレントディレクトリにあるsample.csvファイルすべてで行い、一つのファイルで出力したいと思っています。
76
-
72
+
77
- 以下のようなプログラムを作成し、目的の値は得られましたが、時間がかかった上にresult.csvの内容が最後のsample1890.csvのもののみでした。
73
+ 以下のようなプログラムを作成し、目的の値は得られましたが、時間がかかりました。
78
-
79
-
80
74
 
81
75
 
82
76
 
@@ -84,63 +78,91 @@
84
78
 
85
79
  import pandas as pd
86
80
 
87
- df_test=pd.read_csv("../test_list.csv",sep=",",header=None,index_col=0)
81
+ df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0)
88
-
82
+
89
- for t in range(1,1890):
83
+ for t in range(1,3):
90
-
84
+
91
- test_files=pd.read_csv("test%s.csv" % (t),sep=",",index_col=0)
85
+ sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0)
86
+
87
+ test_id=pd.concat([df_test.iloc[0,:],sample_files],axis=1)
88
+
89
+ df_frame=pd.DataFrame(test_id.iloc[0,:]).T
90
+
91
+ for i in range(1,247):
92
+
93
+ df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
94
+
95
+ df_diff_id=pd.concat([test_id.iloc[i,:4],df_diff])
96
+
97
+ for k in range(10):
98
+
99
+ if df_diff[k] !=0.0:
100
+
101
+ df_frame=df_frame.append(df_diff,ignore_index=True)
102
+
103
+ df_frame_unique=df_frame.drop_duplicates()
104
+
105
+ df_frame_unique.to_csv("result.csv",sep=",")
106
+
107
+ print(df_frame_unique)
108
+
109
+ ```
110
+
111
+
112
+
113
+ そこで以下の様にプログラムを修正し、目的のものが得られました。
114
+
115
+
116
+
117
+ ```ここに言語を入力
118
+
119
+ df_result=pd.DataFrame()
120
+
121
+ import pandas as pd
122
+
123
+ df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0)
124
+
125
+ for t in range(1,3):
126
+
127
+ sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0)
92
128
 
93
129
  test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1)
94
130
 
95
- df_frame=pd.DataFrame(df_test_id.iloc[0,:]).T
131
+ df_frame=pd.DataFrame(test_id.iloc[0,:]).T
96
-
132
+
97
- for i in range(1,270):
133
+ for i in range(1,247):
98
134
 
99
135
  df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
100
136
 
101
- df_diff_id=pd.concat([test_id.iloc[i,:4],df_index])
137
+ df_diff_id=pd.concat([df_test.iloc[i,:4],df_diff])
102
-
103
- for k in range(10):
138
+
104
-
105
- if df_diff[k] !=0.0:
139
+ if df_diff.sum() ! = 0:
106
140
 
107
141
  df_frame=df_frame.append(df_diff,ignore_index=True)
108
142
 
109
- df_frame_unique=df_frame.drop_duplicates()
143
+ df_result=pd.concat([df_result,df_frame])
144
+
110
-
145
+ print(df_result)
146
+
111
- df_frame_unique.to_csv("result.csv",sep=",")
147
+ df_result.to_csv("result.csv",sep=",")
112
-
113
- print(df_frame_unique)
148
+
149
+
114
150
 
115
151
  ```
116
152
 
117
- 得られた結果。
118
-
119
-
120
-
121
- 5123 sample235 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
122
-
123
- 5133 sample236 ASP H 112 -0.59 -0.4 ... -0.51 -1.3 -0.08 -0.1 -0.51
124
-
125
- 5143 sample237 ASP H 112 -15.02 -10.7 ... -15.03 -39.8 0 0 -15.02
126
-
127
- 5149 sample239 ASP H 112 -13.12 -9.3 ... -12.46 -33 -0.67 -1.3 -12.45
128
-
129
- 5159 sample23 ASP H 112 -17.71 -12.6 ... -17.07 -45.2 -0.64 -1.3 -17.07
153
+ 最初のプログラムで時間がかかり過ぎたのと一つのファイルで出力できていなかったので質問させて頂きましたが、質問を修正しているうちに2つ目のプログラムでよいことに気付きました。
130
-
154
+
131
- 5169 sample240 ASP H 112 -10.35 -7.3 ... -10.36 -27.4 0 0 -10.35
155
+ ですが、折角ですので勉強のため、修正点やほかにもっといい方法があれば教えてください
132
-
133
- 5175 sample241 ASP H 112 -2.97 -2.1 ... -2.98 -7.9 0 0 -2.98
156
+
134
-
135
- 5181 sample242 ASP H 112 -19.8 -14.1 ... -19.55 -51.8 -0.26 -0.5 -19.54
157
+
136
-
137
- 5191 sample243 ASP H 112 -25.04 -17.8 ... -20.25 -53.7 -4.8 -9.7 -20.25
158
+
138
-
139
- 5201 sample244 ASP H 112 -20.92 -14.9 ... -19.72 -52.3 -1.2 -2.4 -19.72
140
-
141
-
142
-
143
- そこで以下の様プログラムを修正し、目的のものが得られました。
159
+ ご指摘いただいたようにファイル出力をループの外にだして以下になりました。
160
+
161
+
162
+
163
+
164
+
165
+
144
166
 
145
167
 
146
168
 
@@ -150,36 +172,48 @@
150
172
 
151
173
  import pandas as pd
152
174
 
153
- df_test=pd.read_csv("../test_list.csv",sep=",",header=None,index_col=0)
175
+ df_test=pd.read_csv("../test.csv",sep=",",header=None,index_col=0)
154
-
176
+
155
- for t in range(1,1890):
177
+ for t in range(1,3):
156
-
178
+
157
- test_files=pd.read_csv("test%s.csv" % (t),sep=",",index_col=0)
179
+ sample_files=pd.read_csv("sample%s.csv" % (t),sep=",",index_col=0)
158
-
180
+
181
+
182
+
159
- test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1)
183
+ test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1)
160
-
184
+
161
- df_frame=pd.DataFrame(df_test_id.iloc[0,:]).T
185
+ df_frame=pd.DataFrame(test_id.iloc[0,:]).T
162
-
186
+
163
- for i in range(1,270):
187
+ for i in range(1,247):
164
-
188
+
165
- df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
189
+ df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
166
-
190
+
167
- df_diff_id=pd.concat([test_id.iloc[i,:4],df_index])
191
+ df_diff_id=pd.concat([df_test.iloc[i,:4],df_diff])
168
-
192
+
169
- if df_diff.sum() ! = 0:
193
+ if df_diff.sum() != 0:
170
-
194
+
171
- df_frame=df_frame.append(df_diff,ignore_index=True)
195
+ df_frame=df_frame.append(df_diff,ignore_index=True).drop_duplicates()
172
-
196
+
197
+
198
+
173
- df_result=pd.concat([df_result,df_frame])
199
+ df_result=pd.concat([df_result,df_frame])
174
-
200
+
175
- print(df_result)
201
+ print(df_result)
176
-
202
+
177
- df_result.to_csv("result.csv",sep=",")
203
+ df_result.to_csv("result.csv",sep=",")
178
-
179
-
180
204
 
181
205
  ```
182
206
 
207
+ ちなみに処理時間は以下の様でした。
208
+
183
- 最初のプログラムで時間がかかり過ぎたのとつのファイルで出力できていなかったので質問させて頂きましたが、質問を修正しているうちに2つ目のプログラムでよいこに気付きました。
209
+ 一ループ内で出力(for i in range(1,247)同じインデント)
210
+
184
-
211
+ elapsed time:19.02880597114563
212
+
185
- すが、折角ですので勉強のため、修正点やほかにもっいい方法があれば教えてください
213
+ 第2ループ内出力(df_result=pd.concat...同じインデント)
214
+
215
+ elapsed time:4.529508113861084
216
+
217
+ ループ外で出力
218
+
219
+ elapsed time:2.024280071258545

1

質問内容を変更し、改善プログラムを作成しました。

2019/04/23 12:28

投稿

kak
kak

スコア27

test CHANGED
File without changes
test CHANGED
@@ -4,15 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- test_list.csvのインデックス0にサンプル名入ってお
8
-
9
- 0~2に'amino acid','chain name','chain number'、3以降に数値が10カラム、合計13カラムからなるtest*.csvが270個カレントディレクトリにあります。
10
-
11
- test1.csv,test2.csv...をdf_testのリストを元に次々に取り込み、test_idによりサンプル名をtest_filesに追加、サンプル名だけのデータフレームのひな型(df_frame)を作成、それぞれのサンプルのカラム3以降の10個の数値が一つでも最初のサンプルと違うものだけサンプル名、'amino acid','chain name','chain number'とそれぞれの数値をひな型にappendで追加していくようにしました。
12
-
13
- 例えばchain number2の情報がtest2.csvに入っており、それぞれ1890個のサンプルの情報が入っています。
14
-
15
-
7
+ カレントディレクトリに以下のようなtest*.csvが270個あます。
16
8
 
17
9
 
18
10
 
@@ -42,6 +34,50 @@
42
34
 
43
35
 
44
36
 
37
+ sample*.csvの左端に以下のtest_list.csvのインデックス0の1890列を縦に挿入。
38
+
39
+
40
+
41
+ 1 2 ... 1889 1890
42
+
43
+ 0 ...
44
+
45
+ NaN sample1 sample1000 ... sample99 sample8
46
+
47
+
48
+
49
+
50
+
51
+ 以下のような形になります。
52
+
53
+
54
+
55
+ 0     1   2 3 4 5 6      9  10 11 12  13
56
+
57
+ 1 sample1 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
58
+
59
+ 2 sample1000 ASP H 112 -20.93 -14.9 ... -18.97 -50.3 -1.96 -3.9 -18.98
60
+
61
+ 3 sample236 ASP H 112 -0.59 -0.4 ... -0.51 -1.3 -0.08 -0.1 -0.51
62
+
63
+ ... ... .. .. ... ... ... ... ... ... ... ... ... ...
64
+
65
+ 1888 sample237 ASP H 112 -15.02 -10.7 ... -15.03 -39.8 0 0 -15.02
66
+
67
+ 1889 sample99 ASP H 112 -13.12 -9.3 ... -12.46 -33 -0.67 -1.3 -12.45
68
+
69
+ 1890 sample9 ASP H 112 -17.71 -12.6 ... -17.07 -45.2 -0.64 -1.3 -17.07
70
+
71
+
72
+
73
+
74
+
75
+ この一つのCSVファイル中でindex2~1890のカラム4~13の値がindex1にあるsample1のそれぞれの数値と異なる数値を含む行のみ取り出し、この処理をカレントディレクトリにある270個のsample.csvファイルすべてで行い、一つのファイルで出力したいと思っています。
76
+
77
+ 以下のようなプログラムを作成し、目的の値は得られましたが、時間がかかった上にresult.csvの内容が最後のsample1890.csvのもののみでした。
78
+
79
+
80
+
45
81
 
46
82
 
47
83
  ```ここに言語を入力
@@ -50,7 +86,7 @@
50
86
 
51
87
  df_test=pd.read_csv("../test_list.csv",sep=",",header=None,index_col=0)
52
88
 
53
- for t in range(1,len(df_test.index)):
89
+ for t in range(1,1890):
54
90
 
55
91
  test_files=pd.read_csv("test%s.csv" % (t),sep=",",index_col=0)
56
92
 
@@ -58,7 +94,7 @@
58
94
 
59
95
  df_frame=pd.DataFrame(df_test_id.iloc[0,:]).T
60
96
 
61
- for i in range(1,len(df_test.columns)):
97
+ for i in range(1,270):
62
98
 
63
99
  df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
64
100
 
@@ -78,17 +114,7 @@
78
114
 
79
115
  ```
80
116
 
81
-
82
-
83
- 以下の様にこのプログラムで目的としていたサンプル1と数値に差のあるものを含むサンプル情報を差の値と共に得られることが出来ました。
84
-
85
- ただ、式が助長な為か処理に時間がかかりすぎ、すべての処理が終わりません。
86
-
87
- 出力でダブっているものが出てい来るのでdrop_duplicatesを使っていますが、それで時間がかかっている気もします。カラム一つ一つに差がないか確認しているからでしょうか?
88
-
89
- sumを使って行に含まれる数値の合計の差が0でないものを取得するようにしようともしましたが、上手くいきませんでした。
90
-
91
- 全体的に何か簡潔にして処理を高速化する方法はありますか?
117
+ 得られた結果。
92
118
 
93
119
 
94
120
 
@@ -111,3 +137,49 @@
111
137
  5191 sample243 ASP H 112 -25.04 -17.8 ... -20.25 -53.7 -4.8 -9.7 -20.25
112
138
 
113
139
  5201 sample244 ASP H 112 -20.92 -14.9 ... -19.72 -52.3 -1.2 -2.4 -19.72
140
+
141
+
142
+
143
+ そこで以下の様にプログラムを修正し、目的のものが得られました。
144
+
145
+
146
+
147
+ ```ここに言語を入力
148
+
149
+ df_result=pd.DataFrame()
150
+
151
+ import pandas as pd
152
+
153
+ df_test=pd.read_csv("../test_list.csv",sep=",",header=None,index_col=0)
154
+
155
+ for t in range(1,1890):
156
+
157
+ test_files=pd.read_csv("test%s.csv" % (t),sep=",",index_col=0)
158
+
159
+ test_id=pd.concat([df_test.iloc[0,:],test_files],axis=1)
160
+
161
+ df_frame=pd.DataFrame(df_test_id.iloc[0,:]).T
162
+
163
+ for i in range(1,270):
164
+
165
+ df_diff=test_id.iloc[i,4:]-test_id.iloc[0,4:]
166
+
167
+ df_diff_id=pd.concat([test_id.iloc[i,:4],df_index])
168
+
169
+ if df_diff.sum() ! = 0:
170
+
171
+ df_frame=df_frame.append(df_diff,ignore_index=True)
172
+
173
+ df_result=pd.concat([df_result,df_frame])
174
+
175
+ print(df_result)
176
+
177
+ df_result.to_csv("result.csv",sep=",")
178
+
179
+
180
+
181
+ ```
182
+
183
+ 最初のプログラムで時間がかかり過ぎたのと一つのファイルで出力できていなかったので質問させて頂きましたが、質問を修正しているうちに2つ目のプログラムでよいことに気付きました。
184
+
185
+ ですが、折角ですので勉強のため、修正点やほかにもっといい方法があれば教えてください