前提・実現したいこと
以前にも同じような質問をしたのですが、物理学の研究で、時間に対する電圧の変化をデータで測定しました。その電圧の平均的な時間変化を求めたいです。
前回の質問の際は自分で練習用にcsvを作りましたが、今回は実験で取ったデータを解析したところエラーがでました。
~やりたいこと~
Python3でpandasを用いて複数のファイルを読み込んで、その右側の配列を結合します。そして列ごとの合計で列ごとの各要素を割ることで電圧を正規化し、それを同じ時間で足すことにより平均的な時間変化を求めています。その結果を新しいファイルに書き込みたいです。
下は適当に3つのCSVファイルを作り、実行した際の過程です。
example
13つのファイルの電圧変化を結合させた 2 0 1 2 30 40.1 17 10 16 50.2 18 10 15 60.3 10 10 14 70.4 22 10 13 80.5 26 10 12 9 10列ごとの合計を出す 110 93 121 50 132 70 14dtype: int64 15 16合計で要素を割る 17 0 1 2 180 190.1 0.182796 0.2 0.228571 200.2 0.193548 0.2 0.214286 210.3 0.107527 0.2 0.200000 220.4 0.236559 0.2 0.185714 230.5 0.279570 0.2 0.171429 24 25足し合わせる 260 270.1 0.611367 280.2 0.607834 290.3 0.507527 300.4 0.622273 310.5 0.650998
発生している問題・エラーメッセージ
panda5.py:13: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'. df = pd.read_csv(filename, skiprows=[0,249], skipfooter=249, names = col_names, delimiter=" ", index_col=0) Traceback (most recent call last): File "panda5.py", line 21, in <module> df_pr = df.apply(lambda li:li/sum(li)) File "/home/usr/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 6878, in apply return op.get_result() File "/home/usr/.local/lib/python3.6/site-packages/pandas/core/apply.py", line 186, in get_result return self.apply_standard() File "/home/usr/.local/lib/python3.6/site-packages/pandas/core/apply.py", line 296, in apply_standard values, self.f, axis=self.axis, dummy=dummy, labels=labels File "pandas/_libs/reduction.pyx", line 620, in pandas._libs.reduction.compute_reduction File "pandas/_libs/reduction.pyx", line 128, in pandas._libs.reduction.Reducer.get_result File "panda5.py", line 21, in <lambda> df_pr = df.apply(lambda li:li/sum(li)) TypeError: unsupported operand type(s) for +: 'int' and 'str'
###読み込みたいファイル
はじめの0249行を飛ばして、2502250行を読み込み、2251~2499行を無視したいです。
CSV
1Record Length,2.500000e+03,, -0.000025000000, 0.00000, 2Sample Interval,1.000000e-07,, -0.000024900000, 0.00800, 3Trigger Point,2.500000000000e+02,, -0.000024800000, 0.00000, 4,,, -0.000024700000, 0.00000, 5,,, -0.000024600000, 0.01600, 6,,, -0.000024500000, 0.01600, 7 ︙ 8,,,-00.000000200000, 0.00800, 9,,,-00.000000100000, -0.00800, 10,,,-00.000000000000, -0.00800, 11,,,00.000000100000, 0.00000, 12,,,00.000000200000, 0.00800, 13 ︙ 14,,,00.000224700000, 0.00000, 15,,,00.000224800000, 0.00800, 16,,,00.000224900000, 0.01600,
該当のソースコード
panda5.pyと名前を付けてます。
Python3
1import pandas as pd 2import glob 3import csv 4 5adf = glob.glob("TEK*.CSV") 6li = [] 7for filename in adf: 8 col_names = ["c{0:02d}".format(i) for i in range(10)] 9 df = pd.read_csv(filename, skiprows=[0,249], skipfooter=249, names = col_names, delimiter=" ", index_col=0) 10 li.append(df) 11 12df = pd.concat(li, axis=1, ignore_index=True) 13#print(df) 14 15#print(df.sum()) 16df_pr = df.apply(lambda li:li/sum(li)) 17#print(df_pr) 18 19result = df_pr.sum(axis=1) 20#print(result) 21result.to_csv("demo_result.csv")
試したこと
5行程度のCSVファイルを自分で作って、下のソースコードを実行したときは問題なくできました。
Python3
1import pandas as pd 2import glob 3import csv 4 5adf = glob.glob("demo*.dat") 6li = [] 7for filename in adf: 8 df = pd.read_csv(filename, skiprows=[0,1], skipfooter=1, header=None, delimiter=" ", index_col=0) 9 10df = pd.concat(li, axis=1, ignore_index=True) 11df_pr = df.apply(lambda li:li/sum(li)) 12 13result = df_pr.sum(axis=1) 14result.to_csv("demo_result.csv")
補足情報(FW/ツールのバージョンなど)
ubuntu:18.04
Python:3.6.9
pandas:1.0.3
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 05:45
2020/05/06 05:59 編集
2020/05/06 07:47
2020/05/06 08:02
2020/05/06 13:41
2020/05/06 14:11
2020/05/06 14:36
2020/05/06 14:58 編集
2020/05/06 17:45
2020/05/06 19:39