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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4021閲覧

Pythonで複数のファイルを読み込んで足し合わせたいです。

happy_boy

総合スコア9

CSV

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/06 03:12

編集2020/05/06 13:42

前提・実現したいこと

以前にも同じような質問をしたのですが、物理学の研究で、時間に対する電圧の変化をデータで測定しました。その電圧の平均的な時間変化を求めたいです。
前回の質問の際は自分で練習用に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

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

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

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

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

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

guest

回答3

0

ベストアンサー

下記エラーは文字列と数値を計算しようとして出ているエラーです。
TypeError: unsupported operand type(s) for +: 'int' and 'str'

【OKの例】

Python

1df2 = pd.DataFrame({'A':[1,2,3,4,5],'B':[6,7,8,9,10]}) 2# A B 3#0 1 6 4#1 2 7 5#2 3 8 6#3 4 9 7#4 5 10 8 9df2.apply(lambda x:x/sum(x)) 10# A B 11#0 0.066667 0.150 12#1 0.133333 0.175 13#2 0.200000 0.200 14#3 0.266667 0.225 15#4 0.333333 0.250 16 17【NGの例】 18df = pd.DataFrame({'A':[1,2,3,4,5],'B':[6,7,8,9,'a']}) 19# A B 20#0 1 6 21#1 2 7 22#2 3 8 23#3 4 9 24#4 5 a 25 26df.apply(lambda x:x/sum(x)) 27Traceback (most recent call last): 28 File "<stdin>", line 1, in <module> 29TypeError: ("unsupported operand type(s) for +: 'int' and 'str'", 'occurred at index B')

データのどこかに数値以外のデータがないか確認してください。


【追記】

Python

1print(df) 2# 0.1 43.2 Unnamed: 2 3#0 0.2 41.1 NaN 4#1 0.3 38.7 NaN 5#2 0.4 34.4 NaN 6#3 0.5 29.9 NaN 7 8print(df.apply(lambda x:x/sum(x))) 9# 0.1 43.2 Unnamed: 2 10#0 0.142857 0.285219 NaN 11#1 0.214286 0.268563 NaN 12#2 0.285714 0.238723 NaN 13#3 0.357143 0.207495 NaN

投稿2020/05/06 04:29

編集2020/05/06 08:00
meg_

総合スコア10760

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

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

happy_boy

2020/05/06 05:45

回答ありがとうございます。 自作のCSVファイルで確認してみたところ2つ目の数字の後ろにあるカンマが邪魔ものらしいです。 1つ目の数値の前にあるコンマ3つは問題なさそうでした。 これを取り除く方法はありますか?
meg_

2020/05/06 05:59 編集

データの先頭部分にある文字列(Record Length等)がエラーの原因ではないでしょうか? 「Record Length,2.500000e+03,, -0.000025000000, 0.00000, Sample Interval,1.000000e-07,, -0.000024900000, 0.00800, Trigger Point,2.500000000000e+02,, -0.000024800000, 0.00000,」 「1,,2」などのデータをpandas.DataFrameで読み込むと「1,Nan,2」となるので問題ないはずです。 但し、Nanデータがあるとdf.apply(lambda x:x/sum(x))の計算結果もNanになってしまうので、Nanに対する処理は別途必要かと思います。
happy_boy

2020/05/06 07:47

先頭の文字列のせいで、以降の数値が文字列として認識しているということですか? 言葉足らずですみません。 先ほど試してみたところ、 ,,,0.1, 43.2 ,,,0.2, 41.1 ,,,0.3, 38.7 ,,,0.4, 34.4 ,,,0.5, 29.9 というファイルに対しては、ソースコードは実行できたのですが 0.1, 43.2, 0.2, 41.1, 0.3, 38.7, 0.4, 34.4, 0.5, 29.9, というファイルに対しては、質問と同じように TypeError: unsupported operand type(s) for +: 'int' and 'str' というエラーが出てきました。したがって、エラーの一因として 43.2, のカンマ部分が数字と一緒に読み取られてしまい、文字列として認識しているのではないかと推測しました。 そこで、どうにか一番最後のカンマを消す方法がないかなと思っています。
meg_

2020/05/06 08:02

上記データで試してみました。回答に追記しましたので見てください。(3列目のデータが「Nan」になっています) ※念のためpandasのバージョンも教えてください
happy_boy

2020/05/06 13:41

pd.read_csvの delimiter=" " 部分を delimiter=" ," にしたら読み込むようにはなったのですが、まだ同じエラーメッセージが出ました。 pandasは1.0.3です。
meg_

2020/05/06 14:11

delimiter=" "の指定をしていたのですね。そこ、見ていませんでした。 元々その区切りで読み込んでいたということは、最後の「,」の後ろにも" "がいるのでしょうか?? df.dtypesでどんな情報が表示されますか?
happy_boy

2020/05/06 14:36

dtype: float64 となります。 ファイルの保存形式が ,,, 数値, 数値, となっているせいでindexがNaN基準になっているので色々変な値になってしまっています。
meg_

2020/05/06 14:58 編集

最初の3列はデータがないようなので、この3列はdropすれば良いでしょう。 「250~2250行」のみ使いたいとのことなので、dfからloc関数などで抽出すれば良いです。 dtypeについてですが「dtype: float64」というのは、dfの全ての列の型が「float64」ですか?データの頭には文字列があったはずですが削除したんでしょうか?文字列が含まれていればobject型と表示されるはずなのですが。 確認したいので、print(df.head())とprint(df.dtypes)の結果を質問に追記してもらえませんか? ※本当にdfの型が「dtype: float64」であればそもそもTypeError出ないんですよね。
happy_boy

2020/05/06 17:45

質問の意図をくみ取れなくて申し訳ないです。 実行結果をそのまま貼り付けます。 <bound method NDFrame.head of 1 2 3 4 5 0 Record Length 2.500000e+03 NaN -0.000025 0.000 NaN Sample Interval 1.000000e-07 NaN -0.000025 0.008 NaN Trigger Point 2.500000000000e+02 NaN -0.000025 0.000 NaN NaN NaN NaN -0.000025 0.000 NaN NaN NaN NaN -0.000025 0.016 NaN ... ... .. ... ... .. NaN NaN NaN 0.000225 0.008 NaN NaN NaN NaN 0.000225 0.000 NaN NaN NaN NaN 0.000225 0.000 NaN NaN NaN NaN 0.000225 0.008 NaN NaN NaN NaN 0.000225 0.016 NaN [2500 rows x 5 columns]> 1 object 2 float64 3 float64 4 float64 5 float64 dtype: object
happy_boy

2020/05/06 19:39

自分なりに考えた結果、エラーコード出さずに実行できたので載せておきます。 迅速で丁寧な対応、心から感謝いたします。 何かご指摘等あればいただけると幸いです。
guest

0

以下のように修正してみてはどうでしょう。

pyton

1df = pd.read_csv(filename, skiprows=list(range(0,250)), skipfooter=249, names = col_names, delimiter=" ", index_col=0, engine='python')

とりあえずの修正箇所は、skiprows に list(range(0,250)) を与えることで [0,1,...,249] にしています。

【追記】
とりあえず、エラーを避けるため、engine='python'を追加しました。

投稿2020/05/06 03:27

編集2020/05/06 04:11
Yasumichi

総合スコア1773

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

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

happy_boy

2020/05/06 04:04

お早い回答ありがとうございます。 修正致しましたが、エラーメッセージが出ました。 ``` 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=list(range(0,250)), 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/mshibata/.local/lib/python3.6/site-packages/pandas/core/frame.py", line 6878, in apply return op.get_result() File "/home/mshibata/.local/lib/python3.6/site-packages/pandas/core/apply.py", line 186, in get_result return self.apply_standard() File "/home/mshibata/.local/lib/python3.6/site-packages/pandas/core/apply.py", line 313, in apply_standard results, res_index = self.apply_series_generator() File "/home/mshibata/.local/lib/python3.6/site-packages/pandas/core/apply.py", line 341, in apply_series_generator results[i] = self.f(v) 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' ``` int型とstr型が混ざっていてエラーが発生しているよということなんですかね?
Yasumichi

2020/05/06 04:07

skipfooter がまずそうですね。
Yasumichi

2020/05/06 04:10

pandasでcsv/tsvファイル読み込み(read_csv, read_table) | note.nkmk.me https://note.nkmk.me/python-pandas-read-csv-tsv/ の「引数skipfooter」において、以下の記述があります。 > 環境によっては以下のようなWarningが出るので、引数engine='python'を指定する。
happy_boy

2020/05/06 05:45

回答ありがとうございます。 自作のCSVファイルで確認してみたところ2つ目の数字の後ろにあるカンマが邪魔ものらしいです。 1つ目の数値の前にあるコンマ3つは問題なさそうでした。 これを取り除く方法はありますか?
Yasumichi

2020/05/06 05:53

意図をつかめてないかもしれませんが。 pandasで要素、行、列に関数を適用するmap, applymap, apply | note.nkmk.me https://note.nkmk.me/python-pandas-map-applymap-apply/ において、「DataFrameの特定の行・列の要素に適用」のところで以下のような説明があります。 > DataFrameの特定の行・列の要素にのみ関数を適用するメソッドはないので、 > > 行・列を選択し、Seriesとしてmap()またはapply()で関数を適用 > 元の行・列に代入して上書き > > という処理を行う。
happy_boy

2020/05/06 19:39

自分なりに考えた結果、エラーコード出さずに実行できたので載せておきます。 迅速で丁寧な対応、心から感謝いたします。 何かご指摘等あればいただけると幸いです。
guest

0

お二方とも、ご質問に丁寧に、素早くお答えいただきありがとうございます。
自分なりに頑張ってみたところ、結果があっているかはわかりませんが、エラーが出ずに処理できたのでそのソースコードを載せておきます。

Python3

1import pandas as pd 2import glob 3import csv 4 5adf = glob.glob("TEK*.CSV") 6li = [] 7for filename in adf: 8 df = pd.read_csv(filename, names=("0","1","2","3","4","5")) 9 df3 = df.set_index("3") 10 df2 = df3.iloc[250:2250] 11 #df1 = df2.dropna(how="all", axis=1) 12 df1 = df2.drop(df.columns[[0,1,2,5]], axis=1) 13 li.append(df1) 14 15df1 = pd.concat(li, axis=1, ignore_index=True) 16df_pr = df1.apply(lambda li:li/sum(abs(li))) 17 18result = df_pr.sum(axis=1) 19result.to_csv("result2.dat", header=None, sep=" ")

読み込みたい全てのファイルにおいて、6列あり、4列目をindexとして5列目を足し合わせたかったです。
そのため、column名を勝手に割り振り、4列目をindexにしました。
次に、250~2250行で十分でしたので、教えていただいたようにilocで使いたい行を指定しました。
また、その他の列がご指摘の通りobjectだったりNaNしかなかったりと不要なものばかりでしたので無視させました。

そのほかの点は大幅な変更はありませんが、ファイルの書き込みをdatにしました。
for文の中はもう少し簡素に描くことができるのではないかと思っておりますが、私の力では今のところこれが精いっぱいです。

しばらくの間は解決済みにしないので、何かご指摘等あればいただけると幸いです。

投稿2020/05/06 19:37

編集2020/06/11 09:13
happy_boy

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問