🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Anaconda

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

ファイル

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

2315閲覧

Key Error が出てしまう

kiiiy

総合スコア2

Anaconda

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

ファイル

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/12/03 06:14

編集2020/12/03 06:43

kaggleリンク内容のデータを用いて、X軸がtest preparation courseでグループ分けしたもの、y軸がmath・reading・writingのテストの総合的な平均点となっている棒グラフを作りたいと考えております。
★9月からの大学の授業で初めてpythonに触れたのでまだ分からない所だらけです。
質問部分の他に3列まとめて平均値を出す部分も自分なりに調べましたが、あっているかどうか自信がありません。他にコードがおかしいよという所があれば教えてください。

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

Key Errorが出てしまう。

mean_df= df['math score']['reading score']['writing score'].mean() File "/opt/anaconda3/envs/Kivy/lib/python3.6/site-packages/pandas/core/series.py", line 882, in __getitem__ return self._get_value(key) File "/opt/anaconda3/envs/Kivy/lib/python3.6/site-packages/pandas/core/series.py", line 991, in _get_value loc = self.index.get_loc(label) File "/opt/anaconda3/envs/Kivy/lib/python3.6/site-packages/pandas/core/indexes/range.py", line 349, in get_loc raise KeyError(key) KeyError: 'reading score'``` ```ここに言語を入力 コード ``````# システム関係のコマンドライブラリ import sys # データベースライブラリ pandas import pandas as pd # 計算用のライブラリ numpy import numpy as np # 作図ライブラリ matplotlib import matplotlib.pyplot as plt # 日本語フォントを設定するためのライブラリ from matplotlib.font_manager import FontProperties fp = FontProperties(fname=r'./fonts/HuiFontP29.ttf', size=16) # データを読み込む try: df = pd.read_csv('./data/students.csv',engine="python") except: print('Data File Read Error: Exit') sys.exit() # figureオブジェクトを生成する fig = plt.figure() # axesオブジェクトをfigureオブジェクトに設定する ax = fig.add_subplot(1, 1, 1) # テスト前の準備の度合いごとの平均値を計算する。 left = df.groupby('test preparation course').mean() # 3つのテストの平均 mean_df= df['math score']['reading score']['writing score'].mean() height = mean_df # axesオブジェクトに対して棒グラフを設定する ax.bar(left,height,width=0.5,color='mediumseagreen', edgecolor='darkgreen',ecolor='orange', capsize=5) # axesオブジェクトに対して凡例設定 # ax.legend(["sample data"]) # axesオブジェクトに対してタイトルを設定 ax.set_title("テスト前準備の有無別の平均点", fontproperties=fp) # axesオブジェクトに対してグリッドを設定 #ax.grid(True) # axesオブジェクトに対して横軸名ラベルと縦軸名ラベルを設定 ax.set_xlabel('テスト前準備の有無', fontproperties=fp) ax.set_ylabel('3つのテストの平均得点', fontproperties=fp) # axesオブジェクトに対して横軸,縦軸の範囲指定 #ax.set_xlim(left= -2, right=40) #ax.set_ylim(bottom=0, top=11) # 表示する plt.show()

試したこと

csvファイルのcolumsをpythonにそのままコピペしたり、名前を変えてみたりしました。

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

python3.6

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

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

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

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

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

meg_

2020/12/03 06:22

コードは「コードの挿入」で記入してください。 リンクは「リンクの挿入」で記入してください。
kiiiy

2020/12/03 06:44

申し訳ございません。変更いたしました。
guest

回答2

0

特定の列のみを対象とするコードの書き方が誤っています。
ここだけの修正で問題ないかどうかは不明ですが、以下のようなコードになります。

python

1mean_df = df[['math score','reading score','writing score']].mean()

投稿2020/12/03 06:46

plasticgrammer

総合スコア629

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

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

kiiiy

2020/12/03 07:09

ご解答ありがとうございます。実行してみたのですが、 self._linewidth = float(w) TypeError: only size-1 arrays can be converted to Python scalarsと出てしまいました。これはbarの部分のコードに問題があるのでしょうか。立て続けに申し訳ございません。
guest

0

ベストアンサー

Key Error が出てしまう

df['math score']['reading score']['writing score'] が間違っています。
DataFrame から一部の列を指定して部分的な DataFrame を作成する方法は df[["列名1", "列名2", "列名3"]] とリストで指定します。

diff

1- df['math score']['reading score']['writing score'] 2+ df[['math score', 'reading score', 'writing score']]

test preparation courseでグループ分け

グループに分けてから各グループごとの平均をとりたい場合はまず、df.groupby("test preparation course") でグルーピングしてから、mean() をとります。

サンプルコード

X軸がtest preparation courseでグループ分けしたもの、y軸がmath・reading・writingのテストの総合的な平均点となっている棒グラフを作りたいと考えております。

matplotlib の部分は全面的に書き換えてしまいましたが、以下のようなグラフを作りたいという意図であっていますか?

python

1import pandas as pd 2from matplotlib import pyplot as plt 3 4try: 5 df = pd.read_csv("StudentsPerformance.csv") 6except: 7 print("Data File Read Error: Exit") 8 9fig, ax = plt.subplots(figsize=(5, 5)) 10 11left = 0 12for course, row in df.groupby("test preparation course").mean().iterrows(): 13 bar1 = ax.bar(left, row["math score"], width=0.5, color="#004E89") 14 bar2 = ax.bar(left + 0.5, row["reading score"], width=0.5, color="#FF6B35") 15 bar3 = ax.bar(left + 1, row["writing score"], width=0.5, color="#F7C59F") 16 17 handle = [bar1, bar2, bar3] 18 left += 2 19 20# 凡例 21ax.legend(handle, ["math", "reading", "writing"], bbox_to_anchor=(1, 1)) 22 23# y 軸のラベル 24ax.set_ylabel("Score") 25ax.set_ylim(0, 100) 26# x 軸のラベル 27ax.set_xticks([0.5, 2.5]) 28ax.set_xticklabels(["completed", "none"]) 29 30plt.show()

イメージ説明

投稿2020/12/03 06:44

編集2020/12/03 06:52
tiitoi

総合スコア21956

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

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

kiiiy

2020/12/03 07:27

ご解答ありがとうございます。まさに作ろうとしていたグラフです! 実行はできるものの、problemに"df" is possibly unbound・”handle" is possibly unbound と出てしまうのですが、これは無視してしまって大丈夫なものですか?(検索しても全く関係のないものが出てきてしまいました)
tiitoi

2020/12/03 07:43 編集

これはエラーではなく、linter が出している警告ですので無視して大丈夫です。 df = pd.read_csv("StudentsPerformance.csv") 内で例外が発生した場合 df という変数に値が束縛 (bound) される前に except 節にいってしまうので、そのあと df を参照しようとしたら、未定義エラー (undefined) になるよ、という警告です。 例外が発生するのはファイルの読み込みに失敗した場合なので、その場合は except 内でプログラムを exit するなどしてください (本題から逸れるので回答のコードでは例外処理は省略しています) 気になる場合はプログラムの先頭で df = None handle = None などと先に変数を定義してください
kiiiy

2020/12/03 08:04

本当にありがとうございました。 とても丁寧な説明で、理解することができました。 今後に活かしていきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問