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

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

ただいまの
回答率

89.49%

Pythonでデータの分離ができない

解決済

回答 4

投稿

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

razuro

score 8

ラベルとデータに分離したい

pythonで弁当販売の予測をしてます
データをxとyに分けようとしたら
エラーが発生した

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


KeyError                                  Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2889             try:
-> 2890                 return self._engine.get_loc(key)
2891             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\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Y'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-3-063c85bc5a18> in <module>
7 lunch = pd.read_csv("train.csv", sep=";", encoding="utf-8")

----> 9 y = lunch["Y"]
10 x = lunch.drop("Y", axis=0)
11 

~\Anaconda3\lib\site-packages\pandas\core\frame.py in getitem(self, key)
2973             if self.columns.nlevels > 1:
2974                 return self._getitem_multilevel(key)
-> 2975             indexer = self.columns.get_loc(key)
2976             if is_integer(indexer):
2977                 indexer = [indexer]

~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
2890                 return self._engine.get_loc(key)
2891             except KeyError:
-> 2892                 return self._engine.get_loc(self._maybe_cast_indexer(key))
2893         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
2894         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\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Y'

該当のソースコード

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report 

lunch = pd.read_csv("train.csv", sep=";", encoding="utf-8")

y = lunch["Y"]
x = lunch.drop("Y", axis=0)

x_train, y_train, x_test, y_test = train_test_split(
x, y, test_size = 0.25)

model = RandomForestClassifier()
Model = model.fit(x_train, y_train)

print("Trainig set score: {:.2f}".format(Model.score(x_train, y_train)))
print("Test set score: {:.2f}".format(Model.score(x_test, y_test)))

csvデータは    
datetime    Y    week    soldout    name    kcal    remarks    event    payday    weather    precipitation    temperature
0    2013-11-18    90    月    0    厚切りイカフライ    NaN    NaN    NaN    NaN    快晴    --    19.8
1    2013-11-19    101    火    1    手作りヒレカツ    NaN    NaN    NaN    NaN    快晴    --    17.0
2    2013-11-20    118    水    0    白身魚唐揚げ野菜あん    NaN    NaN    NaN    NaN    快晴    --    15.5

な感じです

試したこと

pandasのアップデートをしてみましたができませんでした

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

jupyter notebook
python3.5

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • hayataka2049

    2019/08/02 00:09

    csvをテキストエディタで開いて貼り付けていただけませんか

    キャンセル

  • razuro

    2019/08/02 00:25

    datetime,y,week,soldout,name,kcal,remarks,event,payday,weather,precipitation,temperature
    2013-11-18,90,月,0,厚切りイカフライ,,,,,快晴,--,19.8
    2013-11-19,101,火,1,手作りヒレカツ,,,,,快晴,--,17.0
    2013-11-20,118,水,0,白身魚唐揚げ野菜あん,,,,,快晴,--,15.5
    2013-11-21,120,木,1,若鶏ピリ辛焼,,,,,快晴,--,15.2
    2013-11-22,130,金,1,ビッグメンチカツ,,,,,快晴,--,16.1
    2013-11-25,135,月,1,鶏の唐揚,,,,,曇,--,14.6
    2013-11-26,145,火,0,豚のスタミナ炒め,,,,,快晴,--,17.9
    2013-11-27,140,水,1,ボローニャ風カツ,,,,,晴れ,--,14.7
    2013-11-28,151,木,0,ハンバーグ,,,,,薄曇,--,17.7
    2013-11-29,116,金,0,タルタルinソーセージカツ,,,,,快晴,--,12.1
    2013-12-2,151,月,1,マーボ豆腐,,,,,快晴,--,13.8
    2013-12-3,153,火,1,厚揚げ豚生姜炒め,,,,,快晴,--,13.9
    2013-12-4,151,水,1,クリームチーズ入りメンチ,,,,,晴れ,--,13.5

    全207行です

    キャンセル

回答 4

+2

csvデータは

貼り付けてあるデータだとTSV(タブ区切り)に見えますが大丈夫ですか?

x = lunch.drop("Y", axis=0)

2列目のYという名前のカラムだとすると、drop で列削除する場合のパラメータ指定は
axis=1
ではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

sep=';'としているため、区切りがされずに一行をひとつの文字列として読み込まれているかと思われます。 そのため「Y」という列名が存在しないのでエラーとなります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/03 14:06

    解決しました
    ありがとうございます

    キャンセル

+1

解答に繋がるか不明ですが、
データセットのラベル列を削除する場合
x = lunch.drop("Y", axis=0)
ではなく
x = lunch.drop("Y", axis=1)
ではないでしょうか?。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/01 23:48

    すみません、データの貼り方が悪かったです
    実際はこんな風です
    datetime,Y,week,soldout,name,kcal,remarks,event,payday,weather,precipitation,temperature
    2013-11-18,90,月,0,厚切りイカフライ,,,,,快晴,--,19.8
    2013-11-19,101,火,1,手作りヒレカツ,,,,,快晴,--,17.0
    axis=1にしても変化がなかったです。

    キャンセル

  • 2019/08/02 07:13 編集

    yu81さんもタブ区切りに言及していますが、この場合
    lunch = pd.read_csv("train.csv", sep=";", encoding="utf-8")
    ではなく
    lunch = pd.read_csv("train.csv", sep=",", encoding="utf-8")
    あるいは
    lunch = pd.read_csv("train.csv",encoding="utf-8")
    ですね。

    フィッティングする前にxとyの中身をprintするなどで確認した方が良いです

    上記を直すと、次にfit関数で例外が出ると思います。
    文字列データを数値に変換する必要がありそうです。
    https://codeday.me/jp/qa/20190301/341226.html

    キャンセル

0

列名は小文字のyになっているので、その前提で対処する必要がありそうですね。

y = lunch["y"]
x = lunch.drop("y", axis=1)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/08/02 06:30

    小文字のyにし、axis=1にしましたが変化なかったです

    キャンセル

  • 2019/08/02 08:25

    sep=";"も変なので、sep=","とかに
    だめなら、8行目にlunchをprintするコードを入れて、なにが出るか教えてください。

    キャンセル

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

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