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

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

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

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

Q&A

解決済

3回答

609閲覧

Python を用いたファイル読み込み、計算

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2020/10/12 03:41

#現状
/Users/・・・/data
の中に
data_000
data_001
data_002

data_099

のようなデータファイルが、数字で割り振られた状態で存在しており、
それぞれのファイルには、次のような配列の形で数字が入っています。
(data_000)
45.165
38.398
43.176
41.118
65.043
66.470
65.093

19940 rows × 1 columns

#やりたいこと
①ファイルを読み込み、各データファイルの平均を求める
②求めた平均を、ファイルの名前順に昇順に並べる

ファイルを一つづつ読み込んで平均を出すことはできたので、次はforを使ってみようと考えたのですが、
その場合for文をどう使えばよいのか分からず、手が止まってしまいました。

詳しい方、ご教授お願いします。

Python

1import numpy as np 2 3#読み込み 4df_000 = pd.read_csv("/Users/.../data_000",header=None) 5#df_000 = np.loadtxt('/Users/.../data_000')それぞれの読み込み方は、どのように違うのか?? 6・・・ 7df_099 = pd.read_csv("/Users/.../data_099",header=None) 8 9#平均をデータに格納? 10data=[ 11ave_000 = np.average(df_000), 12ave_001 = np.average(df_001), 13・・・ 14ave_099 = np.average(df_099) 15] 16#力尽くで読み込めなくもないが、効率的ではない 17 18data.sort() 19[29.680,30.924,30.964,] 20#数字でsortされてしまう 21

*jupyter notebookを使っています

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

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

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

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

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

guest

回答3

0

ベストアンサー

①ファイルを読み込み、各データファイルの平均を求める

ファイルまでのパスの文字列を作成し、ファイルの読み込みを行います。
このとき、変数名をdf_000...df_099とすると、扱いにくいのでListnumpy.ndarrayDataFrameのいづれかで保持することをお勧めします。
ここでは、DataFrameで行います。

python

1import pandas as pd 2 3# 空のデータフレームの作成 4df = pd.DataFrame() 5 6# ファイル名の作成とデータ(pandas.Series型)の追加 7for i in range(100): 8 file_name = 'data_{:03}'.format(i) 9 df = df.append(pd.read_csv('/Users/.../data/'+file_name, header=None, names=[file_name], squeeze=True))

この時点で、dfを出力するとこのようにデータ(pandas.DataFrame型)が格納されています。
(データの長さが違うとNaNで欠損値処理されます。)

0 1 2 ... 19938 19939 data_000 45.165 38.398 43.176 ... 65.093 NaN ... data_099 45.165 38.398 43.176 ... 65.093 20.308

そして、平均値は.meanで求められます。
axis=1は上のdfの出力でいう横方向に平均をとる、ということです。

python

1# 平均値の取得 2data_mean = df.mean(axis=1)

最後に、data_meanを出力すると、このようにデータ(pandas.Series型)が格納されています。

data_000 52.066143 ... data_099 48.096375 dtype: float64

例えば、data_000の平均値を取得したいときには

python

1data_mean['data_000']

とすると、

52.06614285714286

と、出力されます。

②求めた平均を、ファイルの名前順に昇順に並べる

もともとファイル名で並べて取得しているので、並び替える必要はありません。
どうしても、並び替えが必要であれば、.sort_index()でソートできます。(デフォルトで昇順ソートです)

python

1data_mean.sort_index()

投稿2020/10/12 05:33

編集2020/10/12 05:38
MeteorShower

総合スコア58

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

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

退会済みユーザー

退会済みユーザー

2020/10/12 06:48

丁寧なご回答ありがとうございます! 出力した結果、ファイル名とその平均値が見やすく、 自分が出力したかったものとドンピシャでした。
guest

0

ファイル名と平均値のタプルのリストを作って、それをソートしたらどうでしょうか。
タプルの比較は、1番目の要素を比較、1番目が同じなら2番目を比較... という風になります。

python

1import numpy as np 2 3# ファイル名のリスト 4files = [f'/Users/.../data_{i:03}' for i in range(100)] 5 6# ファイル名と平均値のタプルのリストを作る 7data = [(filename, np.loadtxt(filename).mean()) for filename in files] 8 9# ソート (→ ファイル名でソートされる) 10sort(data) 11 12# 平均値だけを取り出す 13averages = [x[1] for x in data]

そもそも、ファイル名のリストの段階でソートしてから、あとの処理をすればいいだけかもしれません。

投稿2020/10/12 04:13

編集2020/10/12 05:57
bsdfan

総合スコア4794

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

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

0

リストの使い方を学びましょう。
リストを知らないと言うことは内包表記も知らないと言うことだと思いますので、これも調べてください。data = の行のことです。

Python

1df = [] 2for i in range(0,100): 3 df.append(pd.read_csv("/Users/.../data_{:03d}".format(i),header=None)) 4 5data = [ np.average(x) for x in df ]

実行してないので、ミスがあるかも。

投稿2020/10/12 04:11

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2020/10/12 06:40

ご回答ありがとうございます! 勉強不足なのはおっしゃる通りです。本を読みながらコードを書いているのですが、 まだまだ応用が効きません 教えていただいたコードで無事動きました! 本当にありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問