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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

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

Anaconda

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

ファイル

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

0回答

1371閲覧

DataFrameの数値データをfloat型に変換する

lunanoir

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

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

Anaconda

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

ファイル

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/06/10 08:09

前提・実現したいこと

センサーから得られた100回分の数値データ(csvファイル)を全てエクセルファイルに変換したいと思っています。csvファイルのデータをデータフレームに入れてエクセルファイルに変換しようとしているのですが,データ型がstrのままで,floatに変換できません。ちなみにデータフレームの行数は毎回異なります。

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

ValueError: could not convert string to float:

該当のソースコード

python files = [] for i in range(1,101): ex_num = i file_name = f"elip_{ex_num}.csv" files.append (file_name) df = pd.DataFrame() df.astype(float) df = pd.read_csv(file, sep=',', encoding='utf-8', error_bad_lines=False) df = df.drop(df.columns[[0]], axis=1) df = df.drop(df.index[[0,1]], axis=0) col = len(df) for j in range(1, col): dfs = df[j:j+1] dfs.astype(float) print (type(dfs)) df.to_excel('elipta_data.xlsx')

試したこと

DataFrameを丸ごとastype(float)で変換するのはできませんでした。drop関数を使ってstr型のデータだと思われる部分(注釈等)を消しましたが,それでも上手くいきませんでした。また各行ごとにスライスしてそれを変換しようとしましたが,上手くいきませんでした。

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

anacondaのjupyter labを使っています

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

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

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

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

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

meg_

2020/06/10 12:06 編集

データ型をfloatにしたいのは何故でしょうか? 数値データを読み込めば自動で数値型になりませんか?
lunanoir

2020/06/10 12:35

ならないんですよね。エクセルで数値が左寄せで,左上に緑の三角みたいなのが現れるんです。 数値にしたら,xlsxwriterを使ってグラフにまとめたり,データの分析をしたりしたいです。
kabayan55

2020/06/10 15:20

str型の時の例を載せていただくことは可能でしょうか。文字列として除去したり変換する部分があるかもしれないと思ったので。他の人のケースで、小数点がカンマになっているなどがありました。
lunanoir

2020/06/10 16:07

files = [] for i in range(4,5): ex_num = i file_name = f"elipta_{ex_num}.csv" excel_sheet_name = f"elipta_data{ex_num}.xlsx" files.append (file_name) df = pd.DataFrame() df = pd.read_table(file_name, delimiter=',', encoding='utf-8', error_bad_lines=False, header=None) col = len(df) df = df.drop(df.columns[[0,9]], axis=1) df = df.drop(df.index[[0,1,2,3,col-1]], axis=0) print (df.astype(float)) df.to_excel(excel_sheet_name) これを実行すると以下のように出てきます。 1 2 3 4 5 6 7 8 4 2.048 -0.092 -0.098 1.071 -1.526 0.916 0.244 2.048 5 2.057 -0.044 -0.062 1.070 -1.404 0.305 0.488 0.009 6 2.066 -0.066 -0.105 1.038 -2.625 1.343 0.244 0.009 7 2.076 -0.075 -0.042 1.076 -1.038 0.610 0.000 0.010 8 2.085 -0.046 -0.085 1.010 -1.465 -0.366 0.183 0.009 ... ... ... ... ... ... ... ... ... 1379 15.647 -0.934 0.000 -0.338 0.427 0.244 0.610 0.010 1380 15.656 -0.934 0.001 -0.335 -0.061 0.122 1.221 0.009 1381 15.667 -0.932 -0.002 -0.342 -0.305 0.366 1.221 0.011 1382 15.676 -0.935 0.001 -0.336 -0.244 0.427 1.404 0.009 1383 15.686 -0.865 -0.020 -0.359 -0.671 0.183 2.075 0.010 [1380 rows x 8 columns]
kabayan55

2020/06/10 23:08

ありがとうございます。print (df.astype(float)) の部分の結果でしょうか?こちらだけ見るとうまくいっているように見えます。エラーも一緒に出てくるということでしょうか? エラーメッセージですが、今質問文に載せてあるもので全部でしょうか。私の場合は、dfにfloatに変換できない部分がある場合、最初に見つかった変換できない箇所の値がエラーとして出力されていました。 もしエラーメッセージに値が出ないようであれば、現時点ではdf全体にかけているかと思うのですが、1行の場合にどのようなエラーが出力されるかも見ていただけますでしょうか。 df["カラム名"].astype(float) のように試してみていただきたいです。 ValueError の後に数値が出てくれば、そちらを見て解決策を考えやすくなると思います。以下の似た状況の質問で、エラー文にエラーが出ている箇所の値もあったので、お願いしたいと思いました。 https://teratail.com/questions/117085
lunanoir

2020/06/11 02:07

先ほど載せたコードではエラーは出ませんでしたが,データ型は<class 'pandas.core.frame.DataFrame'>のままでした。カラム名に番号を入れてみましたが,そもそもカラム名が無効なのか,別のエラーが出ました。 for i in range(4,5): ex_num = i file_name = f"elipta_{ex_num}.csv" excel_sheet_name = f"elipta_data{ex_num}.xlsx" files.append (file_name) df = pd.DataFrame() df = pd.read_table(file_name, delimiter=',', encoding='utf-8', error_bad_lines=False, header=None) col = len(df) df = df.drop(df.columns[[0,9]], axis=1) df = df.drop(df.index[[0,1,2,3,col-1]], axis=0) print (df["3"].astype(float)) df.to_excel(excel_sheet_name) を出力すると,以下のエラーが出ました KeyError Traceback (most recent call last) ~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance) 2645 try: -> 2646 return self._engine.get_loc(key) 2647 except KeyError: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index_class_helper.pxi in pandas._libs.index.Int64Engine._check_type() KeyError: '3' During handling of the above exception, another exception occurred: KeyError Traceback (most recent call last) <ipython-input-57-5d6c7654a0ed> in <module> 10 df = df.drop(df.columns[[0,9]], axis=1) 11 df = df.drop(df.index[[0,1,2,3,col-1]], axis=0) ---> 12 print (df["3"].astype(float)) 13 df.to_excel(excel_sheet_name) 14 ~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key) 2798 if self.columns.nlevels > 1: 2799 return self._getitem_multilevel(key) -> 2800 indexer = self.columns.get_loc(key) 2801 if is_integer(indexer): 2802 indexer = [indexer] ~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance) 2646 return self._engine.get_loc(key) 2647 except KeyError: -> 2648 return self._engine.get_loc(self._maybe_cast_indexer(key)) 2649 indexer = self.get_indexer([key], method=method, tolerance=tolerance) 2650 if indexer.ndim > 1 or indexer.size > 1: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index_class_helper.pxi in pandas._libs.index.Int64Engine._check_type() KeyError: '3' 初歩的なミスだったらすみませんが教えていただけると嬉しいです。
kabayan55

2020/06/11 10:51

> 先ほど載せたコードではエラーは出ませんでしたが,データ型は<class 'pandas.core.frame.DataFrame'> type(df) した結果でしょうか? こちらは正しいと思います。 df全体の型はDataFrame, 1行取り出すとSeries, 各値はstrであったりintであったりfloatであったりして、行ごとに同じです。 > print (df["3"].astype(float)) すみません、str型かと思っていたのですが、カラム名はintで入っているようですね。 print (df[3].astype(float)) で再挑戦してみてください。 質問文では float型に変更できなさそうなカラムをdropしていらっしゃいますが、例えば、 df[3]=df[3].astype(float) #3のみfloatにしたい df[[2, 4, 7]]=df[[2, 4, 7]].astype(float) # 2, 4, 7をfloatにしたい のように、変換したい行のみを指定することができます。df全体の方にも変更が反映されます。 dfにfloatにできない文字列(数値以外)がある場合は、df.astype(float) で全体に対して型の変更を行うことはできません。
lunanoir

2020/06/11 13:29

無事にfloat型に変換できました。 >df全体の型はDataFrame, 1行取り出すとSeries, 各値はstrであったりintであったりfloatであったりして、行ごとに同じです。 そもそも,この構造を理解していなかったので,見当違いな操作を施していました。 最後まで本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問