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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

311閲覧

Python; データ欠損部を取り除いたデータ再構築

BuhKeil

総合スコア34

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/24 14:53

前提・実現したいこと

欠損値を含むCSVデータにおいて、欠損値の行をスキップしたリストを作成したいです。

具体的には(わかりやすさのために空白を意図的に入れています)、
timestamp, temp1, temp2
20190224T220301, 23.4,,
20190224T220305, ,18.9
20190224T220306, 23.8,,
20190224T220311, ,18.5

のようなデータで、1列目の時刻は必ず出力されるのですが、2列目(temp1)と3列目(temp2)とは値がある時とない時とがあります。やりたいことは、2列目(あるいは3列目)のデータがある時のCSVを作ることです。すなわち(temp1の場合なら)、

timestamp, temp1
20190224T220301, 23.4
20190224T220306, 23.8

のような出力を期待しています。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "<ipython-input-40-22bf500f84b5>", line 5, in <module> if buf[1] == "": IndexError: list index out of range

該当のソースコード

Python

1with open("data8974.csv", mode = "r", encoding = "utf-8") as f: 2 for line in f: 3 buf = line.rstrip().split(",") 4 if buf[1] != "": 5 print(buf[0] + "," + buf[1])

試したこと

2列目(temp1)で、データがない部分をどのように条件すべきなのかが問題なのは理解しています。最初は、上記のソースコードに示すように、buf[1] != ""、で実行できると思いました。temp1にデータがある対のデータは得られるのですが、上記のようなエラーに対する適切なコードがわかりません。buf[1] = NaN、なども試しましたが、list index out of range、という同様のエラーが出てわからなくなってしまいました。

どのような記述があるのか教えていただきたいです。

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

Windows10
Anaconda Spyder 3.3.2
Anaconda Pandas 0.23.4
Anaconda Python 3.7.1
Anaconda IPython 7.2.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

空行などが混ざっていて

python

1buf = line.rstrip().split(",")

bufの長さが2以上にならないと、そのエラーになるでしょう。

とりあえず読み飛ばしてみる。

python

1with open("data8974.csv", mode = "r", encoding = "utf-8") as f: 2 for line in f: 3 buf = line.rstrip().split(",") 4 if len(buf) < 2: 5 print("読み飛ばし:", buf) 6 continue 7 if buf[1] != "": 8 print(buf[0] + "," + buf[1])

print("読み飛ばし:", buf)でprintされるものを見て問題なければ消しても良いですが、もしここに出てきてほしくないものが出てきたらデバッグしましょう。

投稿2019/02/24 20:04

hayataka2049

総合スコア30933

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

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

BuhKeil

2019/02/24 20:44

hayataka2049様 回答くださりありがとうございます。 上記のコードでエラーが発生の原因が分かりました。 データの最下行に空行(\nだけ?)があったことが原因でした。 解決しました。これでうまくCSV加工ができそうです。 感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問