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

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

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

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

Q&A

解決済

2回答

962閲覧

csvファイルを読み込みグラフを作成したい

tomonitanimo

総合スコア5

CSV

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

0グッド

0クリップ

投稿2021/06/17 01:51

前提・実現したいこと

csvファイルとして保存されている実験データを読み込み、グラフを作成するプログラミングを作成しています。バージョン(python3.7)
その際に以下のエラーが発生しました。

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

Traceback (most recent call last): File "C:\Users\user.spyder-py3\I_Vsweep一括動作特性.py", line 34, in <module> i.append([float(df['I1'][j])]) ValueError: could not convert string to float:

該当のソースコード

import matplotlib.pyplot as plt import pandas as pd import glob import os plt.rcParams['xtick.direction']='in' plt.rcParams['ytick.direction']='in' fig, ax = plt.subplots(1,1) col_names = ['D','V1','V2','I1','I2','R'] file_pass = glob.glob('F:/0911/素子1_21-40/*.csv') file_pass.sort(key = os.path.getmtime) c = 0 for file in file_pass: df = pd.read_csv(file, names = col_names) df = df.replace("'") v = ([]) i = ([]) c = c + 1 for j in range(216, len(df)): v.append([float(df['V1'][j])]) i.append([float(df['I1'][j])]) ax.plot(v, i, label = 'device '+ str(c)) ax.legend(bbox_to_anchor=(1.05,1),loc = 'upper left', borderaxespad=0) ax.set_yscale("log") ax.set_title('switching I-V') ax.set_xlabel("V") ax.set_ylabel("I")

試したこと

float(df['I1'][216])
Out[46]: -1.4169200000000002e-10
上記のようにfor文を用いずに変換すると正しく変換されているようなのです。
しかしながら、
for j in range(216,len(df)):
print(float(df['I1'][j]))
Traceback (most recent call last):

File "<ipython-input-48-e11b1cc39de7>", line 2, in <module>
print(float(df['I1'][j]))

ValueError: could not convert string to float:
上記に用に繰り返しを用いるとエラーが発生します。
また、ネットで調べてDecimalで変換するなどもやってみたのですがうまくいかなかったようです。

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

読み込むcsvファイルは下記のようになっています。
D ... R
0 SetupTitle ... NaN
1 PrimitiveTest ... NaN
2 TestParameter ... NaN
3 TestParameter ... NaN
4 TestParameter ... NaN
.. ... ... ...
247 DataValue ... 77221884.213974833
248 DataValue ... 73755911.3193631
249 DataValue ... 44300993.607999496
250 DataValue ... 1125314.1502002643
251 DataValue ...

[252 rows x 6 columns]
問題のI1列は以下のようになっています。
0 NaN
1 NaN
2 NaN
3 SMU
4 SMU2:MP

247 -1.28202E-08
248 -1.38294E-08
249 -2.37015E-08
250 -9.59732E-07
251
Name: I1, Length: 252, dtype: object

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

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

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

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

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

can110

2021/06/17 02:20

「for j in range(216, len(df)):」の次行に「print(j)」を追加し、何行目でエラー発生しているかを特定してください。 さらにその時のdf['I1']に入っている値を「print( df['I1'][???])」なりで確認し提示ください。
tomonitanimo

2021/06/17 03:08

can110様 修正依頼ありがとうございます。回答してくださっ方が指摘してくれたように最後の部分が空文字になっていてエラーになっていたようです。しかし、can110様のおかげでfor文でエラーが出た時の対処法について勉強させていただきました。ありがとうございました。
guest

回答2

0

pandas.to_numeric()を使うと、文字列から数値への変換が簡単にできます。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_numeric.html

errors='coerce'でやると、数値に変換できないところがNaNになります。
グラフプロットが目的なら、それで問題ないかと思います。

python

1for file in file_pass: 2 df = pd.read_csv(file, names = col_names) 3 df = df.replace("'") 4 c = c + 1 5 v = pd.to_numeric(df['V1'][216:], errors='coerce') 6 i = pd.to_numeric(df['I1'][216:], errors='coerce') 7 ax.plot(v, i, label = 'device '+ str(c)) 8 ax.legend(bbox_to_anchor=(1.05,1),loc = 'upper left', borderaxespad=0)

どこでどういう理由でエラーになっているかは、わかっておいた方が安心なので、
他の方のコメント、回答のように確認しておいた方が良いと思います。

投稿2021/06/17 02:58

編集2021/06/17 03:02
bsdfan

総合スコア4560

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

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

tomonitanimo

2021/06/17 03:10

bsdfan 様 ご丁寧に教えてくださり、ありがとうございます。今後グラフ作成の際に参考にさせていただきます。
guest

0

ベストアンサー

おそらく、251行目で空文字列をfloatにしようとしてエラーが起きています。

for j in range(216, len(df)):

for j in range(216, len(df)-1):

にして試してみて下さい。

投稿2021/06/17 02:34

ppaul

総合スコア24666

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

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

tomonitanimo

2021/06/17 03:09

ppaul 様 ご指摘のやうに修正しましたら、エラーが解決しました。すごい初歩的なものでした、すみません。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問