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

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

ただいまの
回答率

88.91%

trainデータとtestデータで片方だけstr型とfloat型の変換ができない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 146

umimarine

score 3

引用テキスト### 前提・実現したいこと

pandasでtestデータとtrainデータを整形していますが
trainでは```Python3 コード

train = train.astype(float)  
#全てfloatに変換される  

しかし、testでは以下を実行するとエラーメッセージ

test = test.astype(float)  

---------------------------------------------------------------------------  
ValueError                                Traceback (most recent call last)  
<ipython-input-41-2f18abe8c2b8> in <module>  
----> 1 test = test.astype(float)  

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py in astype(self, dtype, copy, errors)  
5696         else:  
5697             # else, only a single dtype is given  
-> 5698             new_data = self._data.astype(dtype=dtype, copy=copy, errors=errors)  
5699             return self._constructor(new_data).__finalize__(self)  
5700   

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in astype(self, dtype, copy, errors)  
580   
581     def astype(self, dtype, copy: bool = False, errors: str = "raise"):  
--> 582         return self.apply("astype", dtype=dtype, copy=copy, errors=errors)  
583   
584     def convert(self, **kwargs):  

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in apply(self, f, filter, **kwargs)  
440                 applied = b.apply(f, **kwargs)  
441             else:  
--> 442                 applied = getattr(b, f)(**kwargs)  
443             result_blocks = _extend_blocks(applied, result_blocks)  
444   

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/blocks.py in astype(self, dtype, copy, errors)  
623             vals1d = values.ravel()  
624             try:  
--> 625                 values = astype_nansafe(vals1d, dtype, copy=True)  
626             except (ValueError, TypeError):  
627                 # e.g. astype_nansafe can fail on object-dtype of strings  

~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/dtypes/cast.py in astype_nansafe(arr, dtype, copy, skipna)  
895     if copy or is_object_dtype(arr) or is_object_dtype(dtype):  
896         # Explicit copy, or required since NumPy can't view from / to object.  
--> 897         return arr.astype(dtype, copy=True)  
898   
899     return arr.view(dtype)  

ValueError: could not convert string to float:   

Python3

が出てしまいます。なぜなのでしょうか。

#train(floatに変換できている)  

PassengerId    Survived    Pclass    Age    SibSp    Parch    Fare    man    woman    child    A    B    C    D    E    F    G    C_Embarked    Q_Embarked    S_Embarked    female    male  
0    1.0    0.0    3.0    22.0    1.0    0.0    7.2500    1.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0    0.0    1.0  
1    2.0    1.0    1.0    38.0    1.0    0.0    71.2833    1.0    1.0    0.0    0.0    0.0    1.0    0.0    0.0    0.0    0.0    1.0    0.0    0.0    1.0    0.0  
2    3.0    1.0    3.0    26.0    0.0    0.0    7.9250    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0    1.0    0.0  
3    4.0    1.0    1.0    35.0    1.0    0.0    53.1000    1.0    1.0    0.0    0.0    0.0    1.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0    1.0    0.0  
4    5.0    0.0    3.0    35.0    0.0    0.0    8.0500    1.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0    0.0    1.0  
#test 全てstr型 floatに変換できない。  

PassengerId    Pclass    Age    SibSp    Parch    Fare    man    woman    child    A    B    C    D    E    F    G    C_Embarked    Q_Embarked    S_Embarked    female    male  
0    892    3    34.5    0    0    7.8292    1    0    0    0    0    0    0    0    0    0    0    1    0    0    1  
1    893    3    47    1    0    7    1    1    0    0    0    0    0    0    0    0    0    0    1    1    0  
2    894    2    62    0    0    9.6875    1    0    0    0    0    0    0    0    0    0    0    1    0    0    1  
3    895    3    27    0    0    8.6625    1    0    0    0    0    0    0    0    0    0    0    0    1    0    1  
4    896    3    22    1    1    12.2875    1    1    0    0    0    0    0    0    0    0    0    0    1    1    0  

試したこと

'Age'が'2','4','',...,'',...と欠損している場所があったため、

train['Age'] = train['Age'].apply(lambda x: '0' if x == '' else x)  
test['Age'] = test['Age'].apply(lambda x: '0' if x == '' else x)  


で補完しています。後は、特段の欠損は見られません。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2020/07/23 13:14

    試したことは実際のコードでしょうか?
    trainに対して処理していますが、やるべきはtestに対してではないでしょうか?

    キャンセル

  • umimarine

    2020/07/23 13:18

    ご回答ありがとうございます。
    testについても同様のことを行っております。修正いたしました。

    キャンセル

回答 1

checkベストアンサー

+1

空文字列があると提示エラーが発生しますが、試したことのように処理していると問題なく動作すると思います。
あとはデータを見ないと何とも言えないので、以下のような感じでtestデータをCSVファイルとして出力し、その中身をコードブロックで囲んで提示ください。

import pandas as pd

df = pd.DataFrame({'Age':['1.2','']})
print(df)
#   Age
#0  1.2
#1
df.to_csv('test.csv', index=None) # 検証用データを出力


df['Age'] = df['Age'].apply(lambda x: '0' if x == '' else x) # ★
df['Age'] = df['Age'].astype(float) # ★がないと ValueError: could not convert string to float:
print(df)
#   Age
#0  1.2
#1  0.0

test.csv

Age
1.2
""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/23 13:42

    この欄はコードブロックが効かないので質問本文を修正して追記ください。
    また、できればエラーが再現する最小限のCSVを新たに作成して提示していただけないでしょうか?

    キャンセル

  • 2020/07/23 13:44

    なお、こちらのコメント欄での3つのCSV文字列を連結してtest.csvに保存して実行してみましたが、エラーなく正常に動作しました。

    キャンセル

  • 2020/07/24 17:01

    ご回答ありがとうございます。
    1万字を超えてしまったため追記できませんでした。
    上の通り別のノートブックで実行したところ、trainと同じように変換することができました。
    ご確認ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る