質問するログイン新規登録

Q&A

解決済

1回答

279閲覧

行数が異なる複数のcsvファイルを読み込み、ある条件を満たす行だけを取り出し、その標本標準偏差を計算したい

yyicp

総合スコア96

Python

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

0グッド

1クリップ

投稿2025/06/09 02:25

編集2025/06/09 02:26

0

1

実現したいこと

test-1-01.csvは以下のようなファイルです。
Run No. A B
100 500 1
101 600 1.8
102 650 2.8

test-1-05.csvは以下のようなファイルです。
Run No. A B
200 550 2.2
201 700 3.1

test-2-14.csvは以下のようなファイルです。
Run No. A B
300 610 2.9

今、この3つのファイルを読み込んで横軸をA、縦軸をBにしてプロットし、2<B<3にある点だけのAの標本標準偏差を計算したいです。図示すると、下図の赤い3点のAの標本標準偏差を知りたいということで、その値はExcelで計算すると、50.33223になります。(関数STDEVを使用)

イメージ説明

「該当のソースコード」のように書けたは書けたのですが、データ数(ファイルの行数)によって自分で入力しなければならない状態になっています。

10行目、for i in range(0,3,1):の3
16行目、for i in range(0,2,1):の2
22行目、for i in range(0,1,1):の1

今後、ファイル数が増えたときにいちいちファイルを開いて行数を確認して自分で入力することなくプログラムが動くようにするにはどのように直せば良いでしょうか。

該当のソースコード

python

1import pandas as pd 2import statistics 3 4ymin=2 5ymax=3 6 7l=[] 8 9lst = pd.read_csv("test-1-01.csv",header=0).values.tolist() 10for i in range(0,3,1): 11 if lst[i][2]>ymin and lst[i][2]<ymax: 12 print(lst[i][2])#2.8 13 l.append(lst[i][1]) 14 15lst = pd.read_csv("test-1-05.csv",header=0).values.tolist() 16for i in range(0,2,1): 17 if lst[i][2]>ymin and lst[i][2]<ymax: 18 print(lst[i][2])#2.2 19 l.append(lst[i][1]) 20 21lst = pd.read_csv("test-2-14.csv",header=0).values.tolist() 22for i in range(0,1,1): 23 if lst[i][2]>ymin and lst[i][2]<ymax: 24 print(lst[i][2])#2.9 25 l.append(lst[i][1]) 26 27print(l)#[650.0, 550.0, 610.0] 28print(statistics.stdev(l))#50.33222956847167

試したこと

こちらを参考にするとglobを使えばできるような気がしたのですが、globに慣れていなくて、2<B<3を満たすデータだけを抜き出すところの書き方がよく分かりませんでした。

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

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

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

YAmaGNZ

2025/06/09 02:34

読み込んだlistの要素数を取得してループすればいいのでは? もしくは for row in lst といった感じで要素でループすればいいのではないですか?
yyicp

2025/06/09 04:02

>YAmaGNZ様 コメントありがとうございます。 melian様の回答にて解決しました。
guest

回答1

0

ベストアンサー

Pandas を利用する場合は以下の様にも書くことができます。

python

1import pandas as pd 2import statistics 3from glob import glob 4 5ymin=2 6ymax=3 7 8df = pd.concat([pd.read_csv(f) for f in glob("test*csv")]) 9l = df.query("@ymin < B < @ymax")["A"].tolist() 10 11print(l) 12print(statistics.stdev(l))

投稿2025/06/09 03:05

melian

総合スコア21611

yyicp

2025/06/09 04:01

できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問