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

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

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

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

Q&A

解決済

1回答

1319閲覧

KeyError: 0 解決方法

ryosuke0313

総合スコア65

Python

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

0グッド

0クリップ

投稿2023/02/16 03:28

前提

以下のコードでエラーが出ており、原因を知りたいです。

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

KeyError Traceback (most recent call last) c:\Users\ryous\anacon\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 3360 try: -> 3361 return self._engine.get_loc(casted_key) 3362 except KeyError as err: c:\Users\ryous\anacon\lib\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() c:\Users\ryous\anacon\lib\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() KeyError: 0 The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11724/522099072.py in <module> 5 for i in range(0,4): 6 hrr=dfhrs[i]['HR'] ----> 7 lorenz_plot(hrr) 8 list13.append(area) ... -> 3363 raise KeyError(key) from err 3364 3365 if is_scalar(key) and isna(key) and not self.hasnans: KeyError: 0

該当のソースコード

python

1begin, end, interval = 0, 480, 120 #2分ごとのデータ 2seq = [*range(begin, end+1, interval)] 3dfhrs = [dfhr.query('@b <=timedelta <= @e') for b, e in zip(seq, seq[1:])] 4 5import math 6import numpy as np 7 8def lorenz_plot(hr): 9 global area ,center,std_x,std_y 10 rri = 60000/hr 11 nn = len(rri) #データの長さ 12 x_data = rri[0:nn-1] #x軸となるデータ 13 y_data = rri[1:nn] #y軸になるデータ(x軸のデータを1点ずらしたデータ) 14 rotation_x_data = [0]; #回転後x軸データ 15 rotation_y_data = [0]; #回転後y軸データ 16 x_data_mean = np.mean(x_data) 17 y_data_mean= np.mean(y_data) 18 center= ((x_data_mean)**2+(y_data_mean)**2)**0.5 19 20 #すべてのデータを-45度回転させる.########################################### 21 sita = -1*(math.pi/4) 22 for n in range(0,nn-1): #データ数が1点減るので、-1してる 23 xx = x_data[n] * math.cos(sita) -1 * y_data[n+1] * math.sin(sita) # 24 rotation_x_data = np.hstack([rotation_x_data, xx]) 25 yy = x_data[n] * math.sin(sita) + y_data[n+1] * math.cos(sita) 26 rotation_y_data = np.hstack([rotation_y_data, yy]) 27 ######################################################################## 28 29 #配列の初期値を0にしていたので、そこを捨てる 30 rotation_x_data = rotation_x_data[1:nn+1] 31 rotation_y_data = rotation_y_data[1:nn+1] 32 33 std_x = np.std(rotation_x_data) #X軸の標準偏差 34 std_y = np.std(rotation_y_data) #X軸の標準偏差 35 36 area = (std_x * std_y * math.pi)/4 #楕円として面積を求める 37 38 x_data_mean = np.mean(x_data) 39 y_data_mean= np.mean(y_data) 40 center= ((x_data_mean)**2+(y_data_mean)**2)**0.5 #楕円の中心 41 42 #center=center.values 43 44 45 return area,center,std_x,std_y 46 47list13=[] 48list14=[] 49list15=[] 50list16=[] 51for i in range(0,4): 52 hrr=dfhrs[i]['HR'] 53 lorenz_plot(hrr) 54 list13.append(area) 55 list14.append(std_x) 56 list15.append(std_y) 57 list16.append(center)

試したこと

KeyError: 0 データの型が異なるとのことで、hrr.valueと変更しても同様のエラー発生

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

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

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

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

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

can110

2023/02/16 04:32

dfhrsは具体的にどのようなデータでしょうか? たとえばprint(type(dfhrs[i]))の結果は何(になると意図している)でしょうか?
ryosuke0313

2023/02/16 04:58

dfhrsはデータフレームになっています。 print(type(dfhrs[1]))の結果は、<class 'pandas.core.frame.DataFrame'> です。
melian

2023/02/16 05:13

エラーメッセージが一部分だけの様ですが、実際にエラーが発生しているのは x_data = rri[0:nn-1] #x軸となるデータ でしょうか?
can110

2023/02/16 05:31 編集

> dfhrsはデータフレームになっています。 > print(type(dfhrs[1]))の結果は、<class 'pandas.core.frame.DataFrame'> です。 であれば、正確にはdfhrsはデータフレームのリスト(その各要素がデータフレーム)ではないでしょうか。 そのループ中のiがいくつで、どのようなデータフレームのときにエラーが発生したか分かるように print(i) df = dfhrs[i] print(df) hrr = df['HR'] と修正して実行した結果を提示ください。
jbpb0

2023/02/16 05:23

canさん > hrr = ['HR'] は、 hrr = df['HR'] でしょうか?
can110

2023/02/16 05:31

はい。修正しました
ryosuke0313

2023/02/16 05:34

for文の中に print(i) df = dfhrs[i] print(df) hrr = df['HR'] を入れて実行しました。以下結果です。 Output exceeds the size limit. Open the full output data in a text editor 0 timedelta HR 0 0 77.000000 1 1 76.238810 2 2 76.000000 3 3 76.041784 4 4 76.122379 .. ... ... 116 116 75.151958 117 117 75.226039 118 118 75.000000 119 119 74.425721 120 120 74.151561 [121 rows x 2 columns] 1 timedelta HR 120 120 74.151561 121 121 75.000000 122 122 77.000000 123 123 77.810746 124 124 77.515047 .. ... ... 236 236 75.526203 237 237 76.000000 ... 239 239 76.083920 240 240 76.000000 [121 rows x 2 columns] 出力が サイズ制限 を超えています。テキスト エディターで完全な出力データ を開く --------------------------------------------------------------------------- KeyError Traceback (most recent call last) c:\Users\ryous\anacon\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 3360 try: -> 3361 return self._engine.get_loc(casted_key) 3362 except KeyError as err: c:\Users\ryous\anacon\lib\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() c:\Users\ryous\anacon\lib\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item() KeyError: 0 The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11724/3880045385.py in <module> 9 print(dfffff) 10 hrr = dfffff['HR'] ---> 11 lorenz_plot(hrr) 12 list13.append(area) ... -> 3363 raise KeyError(key) from err 3364 3365 if is_scalar(key) and isna(key) and not self.hasnans: KeyError: 0 三つ目のデータフレームに問題があるのでしょうか、似ている関数では実行できたため、def lorenz_plot(hr)の関数の中身がおかしいのでしょうか。
jbpb0

2023/02/16 05:44 編集

> for文の中に (略) print(i) を入れて実行しました。 を入れた場所は、「lorenz_plot(hrr)」よりも上ですか? 下ですか? > 三つ目のデータフレームに問題があるのでしょうか 上ならば二つ目、下ならば三つ目ですね 【追記】 コメントのエラーを見たら分かりました 上ですね 失礼しました
ryosuke0313

2023/02/16 05:45

「lorenz_plot(hrr)」よりも上に入れました。
melian

2023/02/16 05:49

もしかして、問題のデータフレームは空(empty)なのではないでしょうか。(query の結果が 0 行)
ryosuke0313

2023/02/16 06:02 編集

print(dfhrs[0]) timedelta HR 0 0 77.000000 1 1 76.238810 2 2 76.000000 3 3 76.041784 4 4 76.122379 .. ... ... 116 116 75.151958 117 117 75.226039 118 118 75.000000 119 119 74.425721 120 120 74.151561 [121 rows x 2 columns] print(dfhrs[3]) timedelta HR 360 360 80.000000 361 361 79.492204 362 362 79.000000 363 363 78.745631 364 364 78.753840 .. ... ... 473 473 80.362555 474 474 80.421916 475 475 80.000000 476 476 78.918723 477 477 77.000000 [118 rows x 2 columns] 全てのprint(dfhrs[i])にはデータが入っています。 また、 hr=dfhr['HR'] rri = 60000/dfhr['HR'] としたとき、 lorenz_plot(rri)は実行できますが、lorenz_plot(hr)は実行できませんでした
jbpb0

2023/02/16 05:59

追加した「df = dfhrs[i]」のすぐ下に下記を追加したら、どうなりますでしょうか? df = df.reset_index()
melian

2023/02/16 06:04

ああ、なるほど、判りました。インデックスが 0 ではなく120 や 360 から始まっていることが原因ですね。となると、values を渡せばよいはずですが、それでもエラーになるとのことなので、各データフレームに対して reset_index(drop=True) を実行すればよいかと思います。
ryosuke0313

2023/02/16 06:14

jbpb0さん、melianさん、can110さん、ありがとうございます。 df = df.reset_index() により解決致しました。長時間ご回答頂きありがとうございました。
guest

回答1

0

ベストアンサー

正確な再現条件は不明ですが、ループのi=1以降ではインデックスが0はじまりでないのでx_data = rri[0:nn-1]にて提示エラーが発生していると思われます。
対策としてはreset_indexで元のデータフレームのインデックスを振りなおしたあとにリストに格納するか、単純に以下のようにnumpyとして扱うと解消すると思います。

Python

1hrr = df['HR'].values 2lorenz_plot(hrr)

投稿2023/02/16 06:03

can110

総合スコア38256

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問