1つのcsvファイルの中身が3×2で、複数のcsvファイルの各成分を平均処理するプログラム

BAついていますが、初心者向けに、得た情報からどう作っていくかをちょっと書いてみます。

今回の問題のポイントは2つ

  1. 平均を得るには、前の質問にあるように、足して個数で割る。
    (df1 + df2) / 2 のような感じ
  2. 100個あったときに、全てのファイルについて処理する方法
    質問にあるように、glob と for 文を使う

で、質問では以下のようになっていますが、これでは、1つめのポイントの足して個数で割るが実現できていません。

python

1csvfiles = glob.glob("./*.csv")2 3for file in csvfiles:4 df = pd.read_csv(file)5 6mean = df.mean() 7mean.to_csv("mean.csv", header=None)

このfor文の中では、変数dfに次々に読んだファイルの内容を代入しているだけで足していませんなので、まずは、これを順に足していくように変える必要があります。
通常、複数あるものをfor文を使って足すとき、加算するための変数を作って、0で初期化します。

python

1d_list = [10, 20, 30]2d_sum = 03for d in d_list:4 d_sum = d_sum + d

今回の場合であれば、以下のような感じでしょうか。

python

1import pandas as pd 2import numpy as np 3import csv 4 5csvfiles = glob.glob("./*.csv")6sum_df = pd.DataFrame(np.zeros((3, 2)))7for file in csvfiles:8 sum_df = sum_df + pd.read_csv(file, header=None)

これで、sum_df にすべての合計が入ります。
(※ 0埋めしたDataFrameの作りかたはいろいろあります。)

合計は出たので、後は総数を数えて割ればいいのですが、総数は、ファイルの名前がリストに入っていますから、これを数えれば得られます。

python

1for file in csvfiles:2 sum_df = sum_df + pd.read_csv(file, header=None)3 4file_count = len(csvfiles)5mean_df = sum_df / file_count

これで終りですが、もう少し。

全てを足す場合、リストに入れて合計する方法もよく使われます。リストを合計するsumという便利な関数があります。

python

1import pandas as pd 2import numpy as np 3import csv 4 5csvfiles = glob.glob("./*.csv")6df_list = []7for file in csvfiles:8 df_list.append(pd.read_csv(file, header=None))9sum_df = sum(df_list)10count_df = len(df_list)11mean_df = sum_df / count_df

こちらの方が、0埋めDataFrameを使わない分、少しすっきりしますね。また、この方式をリスト内包表記で書いたものがBAのコードです。

コメントを投稿

0 コメント