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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

5452閲覧

複数のCSVファイルの列ごとのデータ平均と標準偏差算出

msym

総合スコア4

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/06/23 15:34

あるフォルダ内にある複数のcsvファイル(すべて8列101行)の時系列データがあり,各csvの同じセルごとに平均値や標準偏差を求めたcsvファイル(8列101行)を新たに作成したいと考えております.

現在下記のように作成してみたのですが,うまく行きません.

for file in files: if not (file.endswith('.CSV') or file.endswith('.csv')): print('skip') continue #print(file) test = pd.read_csv(file, header = None, engine="python")   #print(test) np_test = test.values # print(np_test) # print(np.mean(np_test, axis=0))

print(np_test)では複数ファイル配列が確認できました(途中省略).

out [[ 3.81 116.42110744 11.55506717 87.43426536 60.41401039 10.03996679 67.39556258 -32.09862578] [ 3.820 116.8401092 13.15872423 87.95743445 59.88379927 10.98897601 68.90879969 -31.46598334] [ 3.8318 117.01302526 15.05095255 88.86546004 59.70175505 12.59007358 70.73742085 -30.48703647] [ 3.8427 117.2006565 17.11245664 89.83292112 59.69748579 14.47461612 72.89325515 -29.42341489] [ 3.8536 117.24206081 19.26860941 90.89479143 60.00357283 16.89246718 75.33878428 -28.21231344] #以下省略,ファイルの数に応じて増える

これを要素ごとに平均したり標準偏差を求めたりしたものをcsvとして書きだせば良いかと思ったのですが,print(np..mean(np_test, axis=0))で確認すると下記のように出力されます.

out [ 4.355 96.70872455 36.65559909 84.26374545 92.88908455 32.37911545 78.45936364 -1.35645405]

内容の確認,teratailでの類似質問の検索をしてみましたが,探し方が悪いためか解決の糸口がつかめない状態です.
まだ使い始めたばかりでわからない点も多々あるのですが,教えていただければ幸いです.
何卒よろしくお願いいたします.

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

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

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

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

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

meg_

2020/06/23 22:01

「各csvの同じセルごと」の意味が良く分かりません。
msym

2020/06/23 23:30

説明不足で申し訳ありません。 例え3つのcsvファイルの一行目(5列)が下記のようになっていた場合において、平均と標準偏差をそれぞれ出したいと考えています。(元のファイルは101行ありますが、簡略化しております) csv1:1, 2, 3, 4, 5 csv2:5, 4, 3, 2, 1 csv3:3, 6, 9, 12, 15 csvave:3, 4, 5, 6, 7 標準偏差も同様にして書き出ししたいと考えております。 よろしくお願いいたします。
guest

回答2

0

ベストアンサー

データをnumpyに変換するとカラム名がなくなります。
それらを維持したままCSVデータを作成したいのであれば、numpy配列に変換するのではなく、xarray(多次元版のpandasのようなもの) を使い、結果をDataFrameで得るのがよいのではないでしょうか。

Python

1import pandas as pd 2import xarray as xr 3 4l = [] 5for file in files: 6 if not (file.endswith('.CSV') or file.endswith('.csv')): 7 print('skip') 8 continue 9 test = pd.read_csv(file, header = None, engine="python") 10 #print(test) 11 l.append(test.to_xarray()) 12da = xr.concat(l, dim='dataset') 13mean_df = da.mean(dim='dataset').to_dataframe() 14std_df = da.std(dim='dataset').to_dataframe() 15 16mean_df.to_csv('mean.csv') 17std_df.to_csv('std.csv')

投稿2020/06/24 00:45

magichan

総合スコア15898

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

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

magichan

2020/06/24 02:16 編集

書き忘れておりましたがデフォルトの標準偏差の計算は、Numpyとxarray共にn法の標準偏差です。pandasのようにn-1法の不偏標準偏差ではありませんのでご注意ください。
msym

2020/06/24 01:50 編集

教えていただきありがとうございます.無事平均,標準偏差を求めることができました! また,補足もありがとうございます.最初の質問で不変標準偏差が必要と正確に記載していなかったので申し訳ありません. もっと勉強したいと思います!
jeanbiego

2020/06/24 01:36

なんと、気づいていませんでした。確かにnumpy.stdのドキュメントみるとddof引数を指定しない限りは標準偏差を出すよと書いてありますね。 勉強になりました。
magichan

2020/06/24 02:24

はい。 pandas,statsmodels,Rと大抵のソフトは n-1法なのに、なぜか numpyだけは n法なんですよね。 で、xarrayは pandasの派生みたいなもんなので当然 n-1法かと思ったら、残念ながら n法でした。 ですので、不偏標準偏差や不偏分散を求めたいのであれば ddofパラメータをつけて da.std(dim='dataset', ddof=1) としてください。
guest

0

3×3行列のテストデータでやってみました。
pandasではなく、numpyでcsv読み込んだほうが早そうです。

python3

1del np_test # 本番不要 2import numpy as np 3 4# テストデータ作成 5file1 = np.arange(9).reshape((3, 3)) 6file2 = np.arange(2,11).reshape((3, 3)) 7file3 = np.arange(3,12).reshape((3, 3)) 8files = [file1, file2, file3] 9 10# ここから処理 11for test in files: 12 if not "np_test" in locals(): # 一回目だけ 13 np_test = test 14 continue 15 np_test = np.dstack([np_test, test]) # 3×3行列を3次元方向に重ねていく 16test_mean = np_test.mean(0) 17test_std = np_test.std(0) 18print(np_test) 19""" 20[[[ 0 2 3] 21 [ 1 3 4] 22 [ 2 4 5]] 23 24 [[ 3 5 6] 25 [ 4 6 7] 26 [ 5 7 8]] 27 28 [[ 6 8 9] 29 [ 7 9 10] 30 [ 8 10 11]]] 31""" 32 33print(test_mean) 34""" 35[[3. 5. 6.] 36 [4. 6. 7.] 37 [5. 7. 8.]] 38""" 39 40print(test_std) 41""" 42[[2.44948974 2.44948974 2.44948974] 43 [2.44948974 2.44948974 2.44948974] 44 [2.44948974 2.44948974 2.44948974]] 45""" 46

投稿2020/06/23 23:26

jeanbiego

総合スコア3966

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

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

msym

2020/06/24 01:53 編集

教えていただきありがとうございます! テストデータで確認でき,実際のcsvファイルでもトライしたのですが,下記エラーが出現しました. TypeError: cannot perform reduce with flexible type typeの問題かと考えておりますので,もう少し試行錯誤してみたいと思います.
jeanbiego

2020/06/24 01:52

csvには文字列が入っていたりしますか? どうも、csv内に文字列も入っているとnumpyでは扱いづらいようです。 pandasの方がいいかもしれません。
msym

2020/06/24 01:54

再度アドバイスいただきありがとうございます!今回はpandasでトライしてみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問