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

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

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

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

Q&A

解決済

2回答

173閲覧

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

yyicp

総合スコア20

Python

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

1グッド

0クリップ

投稿2024/04/22 06:49

実現したいこと

この質問の関連質問です。
平均したいファイルが100個あるときにはどうすれば良いでしょうか。

さすがにdf1 = pd.read_csv('sample1.csv', header=None)みたいな行を100個書くのは非効率な気がします。

sample1.csvは以下の通りです。
1 2
3 4
5 6

sample2.csvは以下の通りです。
7 8
9 10
11 12

この2つのファイルの各セルの値の平均は
4 5
6 7
8 9
です。

該当のソースコード

python

1import pandas as pd 2 3df1 = pd.read_csv('sample1.csv', header=None) 4df2 = pd.read_csv('sample2.csv', header=None) 5 6result = (df1 + df2) / 2 7print(result) 8

試したこと

この質問の回答が少し関係しているかもしれないと思ってので、付記しておきます。
(関係していなかったら申し訳ありません)

また、別の人が書かれた下記コードを、
sample1.csvとsample2.csvがあるフォルダで回してみたのですが、出力されたmean.csvは下記の通りとなりました。
7 10
8 11

python

1import pandas as pd 2import glob 3 4csvfiles = glob.glob("./*.csv") 5for file in csvfiles: 6 df = pd.read_csv(file) 7mean = df.mean() 8mean.to_csv("mean.csv", header=None)
melian👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

別の人が書かれた下記コードを、

以下の様にして計算するとよいかと思います。

python

1import pandas as pd 2import glob 3 4csvfiles = glob.glob("./*.csv") 5mean = sum([pd.read_csv(file, header=None) for file in csvfiles]) / len(csvfiles) 6mean.to_csv("mean.csv", header=None)

投稿2024/04/22 07:04

melian

総合スコア19825

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

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

yyicp

2024/04/22 07:15

ご回答ありがとうございます。 mean.csvが下記の通りになりました。 0 4 5 1 6 7 2 8 9 一番左の行(0、1、2)を表示しない(消す?)方法も教えてください。
melian

2024/04/22 07:20

はい、その場合は to_csv() に index=False を指定します。 mean.to_csv("mean.csv", index=False, header=None) それと、カレントディレクトリに mean.csv を作成すると、次の実行の際に mean.csv も glob.glob("./*.csv") に含まれてしまいますのでご注意下さい。
yyicp

2024/04/22 07:26

できました。 どうもありがとうございました。 「カレントディレクトリに ・・・」の件も了解しました。 どうもありがとうございます。
guest

0

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 = 0 3for 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のコードです。

投稿2024/04/22 08:43

TakaiY

総合スコア12774

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

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

yyicp

2024/04/23 01:14

>TakaiY様 詳細な解説、どうもありがとうございました。 私はまだまだPythonに不慣れなので、とても有難いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問