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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

1回答

2150閲覧

pythonでのcsvファイルの平均の計算

kkkkknnnnn

総合スコア3

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2021/11/10 18:18

前提・実現したいこと

csvファイルで、特定の行ごとに列ごとで平均を出したいです。
例えば、
num,a,b,c
1,3,3,4
1,3,3,8
2,7,1,2
3,2,6,8
3,2,4,4
3,6,7,8
7,6,3,2
7,6,7,8
といったcsvファイルがある時
num,a,b,c
1,3,3,6
2,7,1,2
3,2,5,6
7,6,5,5
といった風に書きたいです。

該当のソースコード

read_fp=csv.reader(open("test.csv", "r"))

num = []
for line in read_fp:
num.append(line[0])
num = list(dict.fromkeys(num))

print(num)

for n in num:
a_list = []
b_list = []
c_list = []
for n in read_fp:
print(n)
a_list = np.append(line[1])
b_list = np.append(line[2])
c_list = np.append(line[3])
print(np.average(a_list, np.float32))
print(np.average(b_list, np.float32))
print(np.average(c_list, np.float32))

試したこと

numの番号が飛び飛びになっているため、numのみの配列を作りそれをfor文で回したら、それぞれの列を計算できるのではないかと思い試してみました。
このやり方が正しいのかも、プログラミング初心者のため、わかりません。ご教授お願いいたします。

補足情報(FW/ツールのバージョンなど)

python3.9.7で実装しています。

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

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

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

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

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

kkkkknnnnn

2021/11/10 21:50

ありがとうございます!!!
guest

回答1

0

ベストアンサー

python

1import numpy as np 2 3tbl = np.loadtxt('data.csv', delimiter=',', skiprows=1, dtype=int) 4result = np.array([tbl[tbl[:,0]==i].mean(axis=0) for i in np.unique(tbl[:,0])]) 5np.savetxt('result.csv', result, delimiter=',', header='num,a,b,c', fmt=('%d', *('%.2f',)*3)) 6 7# result.csv 8# num,a,b,c 91,3.00,3.00,6.00 102,7.00,1.00,2.00 113,3.33,5.67,6.67 127,6.00,5.00,5.00

追記

文字列が含まれている場合ではどうしたらいいでしょうか?

python

1import numpy as np 2 3# load 4cols = ('num', 'a', 'b', 'c', 'name') 5tbl = np.loadtxt( 6 'data.csv', delimiter=',', skiprows=1, 7 dtype={'names': cols, 8 'formats': (*(np.int64,)*4, (np.str_, 10))}) 9 10# mean 11names = np.unique(tbl['name']).tolist() 12tbl = np.array([tbl[n] for n in cols])[:-1].T.astype(int) 13result = np.array([tbl[tbl[:,0]==i].mean(axis=0) for i in np.unique(tbl[:,0])]) 14 15# save 16fmt = ['{:.0f}'] + ['{:.2f}']*3 17result = [[fmt[m].format(i) for m, i in enumerate(l)] + [names[n]] for n, l in enumerate(result.tolist())] 18np.savetxt('result.csv', result, delimiter=',', header=','.join(cols), fmt='%s') 19 20# result.csv 21# num,a,b,c,name 221,3.00,3.00,6.00,aa 232,7.00,1.00,2.00,bb 243,3.33,5.67,6.67,cc 257,6.00,5.00,5.00,dd

一方、Pandas を使うと簡単にできます。

python

1import pandas as pd 2 3df = pd.read_csv('data.csv') 4dfx = df.groupby('num').mean().join(df['name']) 5dfx.to_csv('result.csv', float_format='%.2f') 6 7# result.csv 8num,a,b,c,name 91,3.00,3.00,6.00,aa 102,7.00,1.00,2.00,bb 113,3.33,5.67,6.67,cc 127,6.00,5.00,5.00,dd

投稿2021/11/10 19:08

編集2021/11/10 21:29
melian

総合スコア19865

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

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

kkkkknnnnn

2021/11/10 19:20

ありがとうございます。 加えて担ってしまい申し訳ありませんが、文字列が含まれている場合ではどうしたらいいでしょうか? データの中に文字列が含まれていることを失念していました。 num,a,b,c.name 1,3.00,3.00,6.00,aa 2,7.00,1.00,2.00,bb 3,3.33,5.67,6.67,cc 7,6.00,5.00,5.00,dd
melian

2021/11/10 19:22

あらまぁ、、ちょっと考えてみますね。
kkkkknnnnn

2021/11/10 19:41

本当に申し訳ないです、、 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問