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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

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

Q&A

解決済

1回答

1839閲覧

np.loadtxt 空列のスキップ

eelglass

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2023/11/10 13:49

実現したいこと

CSVから読み込む際の「ValueError: could not convert string to float: ''」の原因について質問させてください。

前提

PythonのNumpyで計算をさせようとしています。

すべて数字の7列のデータを含むCSV("rocky.csv")をnp.loadtxtで読み込もうとしたところ下記のエラーメッセージが出ました。
どうも1行8列目の空白のセルをfloat型に変換しようとしているためエラーになっているようです(試したこと1)。
他のCSVファイルでは処理できたため、なぜ本データのみエラーになるか知りたいです。
また、usecolsで列を限定しても処理できなかったのですが、その原因についても知りたいです。

初心者質問で恐縮ですが、何卒よろしくお願いいたします。
なお、処理自体はnp.genfromtxtを使って進めることができました。

エラーメッセージ ValueError: could not convert string to float: ''

該当のソースコード

Python

1filename = "rocky.csv" 2data1 = np.loadtxt(filename, delimiter=",", usecols=[1] , encoding="utf-8_sig")

試したこと

1)
1行目の8列目に”a”と入力したところ「ValueError: could not convert string to float: 'a'」とでてきて、8列目を空白、9列目に”a”と入力したところ「ValueError: could not convert string to float: ''」とでたことから、8列目以降の空白を読もうとしてエラーになっているのだと思います。

2)usecols=[1]のように使用列を限定しても同様のエラーが出ました。

3)空白のcsvファイルに数字の列だけコピペしたものも処理できなかったため、8列目以降にスペースなどの文字?が入っているわけではないと思われます。

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

Python 3.10.4
Numpy 1.22.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

どうも1行8列目の空白のセルをfloat型に変換しようとしているためエラーになっているようです(試したこと1)。

以下の様な CSV ファイル(1行目の7列目が空欄)を読み込むと、同様のエラーメッセージが表示されます。
質問にも書かれてあるとおり numpy.genfromtxt を使用すれば欠損値を自動的に NaN に変更してくれますので(filling_values キーワードに値を指定すれば、その値に変更)、それでよいかと思います。numpy.loadtxt にはその様な機能はありませんので、converters キーワードに欠損値を変換する関数を指定することになります。

python

1import io 2import numpy as np 3 4csv_data = ''' 51,2,3,4,5,6, 61,2,3,4,5,6,7 71,2,3,4,5,6,7 8''' 9 10# Python 3.11.6/Numpy 1.26.1 11# ValueError: could not convert string '' to float64 at row 0, column 7. 12data1 = np.loadtxt(io.StringIO(csv_data), delimiter=",", encoding="utf-8_sig") 13 14# convert missing value to NaN 15data1 = np.loadtxt(io.StringIO(csv_data), delimiter=",", encoding="utf-8_sig", 16 converters=lambda x: float(x) if (x:=x.strip()) else np.NaN) 17print(data1) 18 19#[[ 1. 2. 3. 4. 5. 6. nan] 20# [ 1. 2. 3. 4. 5. 6. 7.] 21# [ 1. 2. 3. 4. 5. 6. 7.]]

また、usecolsで列を限定しても処理できなかったのですが、その原因についても知りたいです。

1列目のどこかに空欄があるのかもしれません。

投稿2023/11/10 14:32

編集2023/11/10 14:37
melian

総合スコア21106

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

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

eelglass

2023/11/13 13:34

ご教示いただきましてありがとうございます。 勉強になります。 usecolsの件についても、空欄を見落としていました。 失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問