質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1088閲覧

python ライブラリを使用せず、CSVデータを読み込んで、最大値と最小値を求める方法

nobita

総合スコア66

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/17 12:18

編集2018/10/17 13:13

csv のデータを読み込んで、 csv の各列の最大値と最小値を求めたいです。
その際、ライブラリは使用せず、求めてみたいです。
下記に書いたコードを載せますが、CSVで読み込んだデータが、文字列で マイナスの数値がうまくintに変換できません。また、読み込んだ時に、\nが末尾に含まれていたり、含まれていなかったり・・
なかなかいい方法がおもいつきません。
アドバイスお願いいたします。

CSV

10.6202894507523649,-4.732210337179897,-4.837565759400999 27.662316204642959,-7.393462117282397,-1.7256234362172673 3-9.000860650190178,5.386582472630646,-0.49756722857258673 4-8.902462874913837,-0.27987478404612354,-4.515285096623288 5-9.391803940946751,8.422614695955076,-4.153502225833776 6-6.749908626465608,-1.3866296185366522,-8.140091097302633 75.498584173099712,0.437729343757562,-8.868594094987536 80.4031336912750447,8.633667135803336,-0.6775380166020355 9-0.5490371265038174,3.9540065878930992,-0.8846440046096333 10-2.7653221752486274,6.519722752462222,-8.147403129377919 11-0.7064688142175655,-3.371742089032077,5.698724767314712 122.324605901134067,-8.180587545724764,1.8611441503787756 134.2874136844746715,7.651221432237712,-9.758625237594975 14-0.07118416779827719,-8.703293523007304,2.55147020764516 150.9039166473499343,-0.08136734204626173,4.399453746803818 163.789725188706406,-3.24691424802052,7.743910414552314 175.272860879216893,7.1741268286134385,-9.574339030500465 18-2.854700835151127,5.68202649205581,-6.998706367872531 198.932633445111268,-1.3022704013075561,-1.7106472363113685 20-6.281687199512367,4.811229460189599,0.4651593596778021 215.790778523828983,-1.4508163203786832,0.2307514968083204 221.7314398932790809,-5.741374011571212,8.292161586979606 23-1.486005284968579,-6.492027354979733,-1.380336172300689 243.8416029592993866,9.977544561079952,3.687784189354762 25-3.17729062109729,-7.694183389165983,6.6567653489826455 26-9.34492566958154,7.161407573706477,6.4924904625646604 274.8969539258859545,0.7732532059573316,-3.0207328669311444 283.020038376578171,2.8392448956466403,5.363404879265021 291.4697854047798913,1.336753542988685,6.253472444305633 30-8.658076535695972,5.488717623169395,-8.429442391668267 31-5.581151598817991,0.3352179609181061,-7.790453356348477 32-9.22102540510602,4.947194842694746,3.189861728855039 33-2.658747691814054,-2.3353224787912623,9.816463195276295 346.675192171048138,-9.362882200541003,5.43167801799604 354.822618432655542,-2.062279431229306,7.642984030597642 364.531020525078219,0.2967780481707081,0.2915914613963224 37-6.674382464558731,-3.1656099540693567,7.670112107646425 38-6.060233912160959,4.7747486900102505,-5.378004161975614 391.4361457264558126,-0.12031127032187072,-2.6786742606274387 402.0896282585619055,-5.493677465305639,2.946501298013617 41-5.652890659682153,6.569278725875002,6.009367363648661 42-8.984796277294473,-8.647130061471328,8.319488948137188 439.406622979075905,-8.748419461239141,-2.6749483520081707 44-5.342407680190107,-6.201013702161038,-6.242373191637807 458.911504267280229,2.8599879664494026,4.939968585487646 460.3919766664994775,4.4542871376702,-9.031401744181535 47-2.5492821387749824,3.3419149402510957,2.49720727200752 487.329362007707573,-1.880143883224413,-0.8806770998478068 49-3.2407234110750167,-7.956493573693184,7.316599607268721 502.4623857225355685,7.272366305142995,9.063826135370082 510.6161047840515721,5.205760831068428,9.603422699210974 52-2.955338447827696,-0.1296749394631309,2.885198738306638 539.163636458373109,-7.190351144089078,-1.5203821018005375 54-2.907406977937783,3.3198013734833243,9.329813309506395 554.398672144888135,9.559107034943118,-0.673642475211512 56-7.983881365880676,7.766138567952364,0.3092120607135378 570.4962173953224376,-1.7754048491853336,-7.386425215869707 58-5.229440628432096,-7.472874286805668,5.115945489361909 59-2.3276670827243144,-1.769984836981557,9.622050341305684 601.658028481070426,9.79695536414436,-1.7516209803704292 61-5.993446796604143,4.760541554067384,5.013762597027796 625.099174291553501,0.550461825269231,2.9747615852339475 63-3.941366858422171,4.579608172554794,3.898916658987835 647.924114027094504,-2.433024865088673,4.245727396766005 65-3.3546291006599223,-5.5385260814403825,-8.686157844328363 660.08514253492516666,9.422576003847436,-6.036660182016069 67-8.142057056634012,9.805504888518723,3.4896576407787787 682.5218422970834364,9.01796200966416,1.6466870577186832 69-0.8223511149339746,0.8327799277704244,5.576635721663219 702.6925674987780983,-0.5943412288335566,-2.322433823460628 71-2.190127459866325,-5.516474026751251,1.0383739254638726 72-8.415790845013145,-8.315620016449245,-8.904152486454286 73-8.845748327859518,7.905282012866024,-0.32583935341251546 74-5.408909876277201,-3.229072680831626,2.0977710961596365 758.954053107761844,5.763149199341417,4.956449516610855 76-2.2797428028821587,-1.8839404003015616,5.279646503197961 776.936277260518754,-3.504555789573896,9.448118755669999 788.374193143785803,-2.483952609539606,0.09156908803776176 79-3.543831933145574,-8.040163484397638,-9.306506952259033 80-0.5370336031619249,7.157325415068495,-6.101876556591943 81-5.240675592688461,-0.6129659503897287,5.124116747135542 82~~~省略~~~

python

1#列の最大と最小を求める 2#ライブラリは使わない 3 4f = open('test1015.csv') 5 6 7a = [] 8b = [] 9c = [] 10d = [] 11 12for s in f: 13 14 a.append(s.split(',')) 15#print(a[0][0]) 16 17a_l = len(a) 18#print(a_l) 19 20 21 22 23 24#二次元配列までいった。縦にはFORぶんかな? 25for i in range(3): 26 for j in range(a_l): 27 if i == 0: 28 29 b.append(a[j][i]) 30 31 elif i == 1: 32 c.append(a[j][i]) 33 34 elif i == 2: 35 36 d.append(a[j][i]) 37 38 39dd = [] 40for s in d: 41 p = s.strip("\n") 42 43 44 dd.append(p) 45 46 47 48#数値に 49b = [float(h) for h in b] 50#print("B",b) 51 52c = [float(n) for n in c] 53#print("C",c) 54dd = [float(L) for L in dd] 55#print("D" ,dd) 56 57 58 59b_b = max(b) 60b_s = min(b) 61print(f"1列目の最大値は{b_b},最小値は{b_s}") 62c_b = max(c) 63c_s = min(c) 64print(f"2列目の最大値は{c_b},最小値は{c_s}") 65dd_b = max(dd) 66dd_s = min(dd) 67print(f"3列目の最大値は{dd_b},最小値は{dd_s}") 68 69 70 71

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

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

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

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

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

guest

回答3

0

ベストアンサー

メモリーに全データをとりこまず、一行分だけをメモリーに保持する形でかいてみました。
(データ行数がどんなに多くなってもメモリー不足にはならないはず)

test1015.csv

1,2,3 10,20,30 1.1, 2.2, 3.3 -1.1, -2.2, -3.3

ccc.py

python3

1COL_NUM = 3 2 3maxs = [None] * COL_NUM 4mins = [None] * COL_NUM 5 6with open('test1015.csv', "r") as fin: 7 for line in fin: 8 line = line.strip() 9 if len(line) > 0: 10 row = [float(x) for x in line.strip().split(',')] 11 for idx in range(COL_NUM): 12 x = row[idx] 13 mins[idx] = x if mins[idx] == None else min(mins[idx], x) 14 maxs[idx] = x if maxs[idx] == None else max(maxs[idx], x) 15 16for idx in range(COL_NUM): 17 print(f"{idx}列目の最大値は {maxs[idx]}, 最小値は {mins[idx]}")

実行例
イメージ説明

投稿2018/10/17 13:45

katoy

総合スコア22324

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

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

0

組み込み関数だけで書くと、以下のようになりますね。

python

1# 読み込み 2data = [] 3with open('test.csv') as f: 4 for line in f.read().splitlines(): 5 row = [float(v) for v in line.split(',')] 6 data.append(row) 7 8# 最大値、最大値計算 9ncols = len(data[0]) 10for c in range(ncols): 11 cols_max = max(row[c] for row in data) # 列 c の最大値計算 12 cols_min = min(row[c] for row in data) # 列 c の最小値計算 13 print('列 {} の最大値: {}, 最小値: {}'.format( 14 c, cols_max, cols_min)) 15# 列 0 の最大値: 2.129141801632275, 最小値: -2.1945926274643837 16# 列 1 の最大値: 1.9489223122008041, 最小値: -2.86261350124414 17# 列 2 の最大値: 2.0422897680105887, 最小値: -1.5966962816032344

実用上は numpy 使ったほうがいいと思いますが。

import numpy as np array = np.loadtxt('test.csv', delimiter=',') print('各列の最大値:', array.max(axis=0)) print('各列の最小値:', array.min(axis=0)) # 各列の最大値: [2.1291418 1.94892231 2.04228977] # 各列の最小値: [-2.19459263 -2.8626135 -1.59669628]

投稿2018/10/17 13:07

tiitoi

総合スコア21956

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

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

nobita

2018/10/17 13:11

ありがとうございます。 先生から時間があるからと、ライブラリをつかわない方法で解いてみて っていわれまして! 実用はライブラリを使用します
guest

0

split でCSVを分割し、trim で\n を削除して、float に変換しましょう。

投稿2018/10/17 12:24

y_waiwai

総合スコア87719

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

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

nobita

2018/10/17 12:48

,,,python f = open('ggg.csv') q = [] for i in f: s = i.split(",") q.append(s) ,,, という感じでいいんでしょうか? CSVのぶんかつ についてです。
y_waiwai

2018/10/17 12:52

実際に実行してみてどうなるか見てみましょうよ
nobita

2018/10/17 13:11

ありがとうございます。 コードを修正したものをアップします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問