前提
以下のコードでエラーが出ており、原因を知りたいです。
発生している問題・エラーメッセージ
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と変更しても同様のエラー発生
dfhrsは具体的にどのようなデータでしょうか?
たとえばprint(type(dfhrs[i]))の結果は何(になると意図している)でしょうか?
dfhrsはデータフレームになっています。
print(type(dfhrs[1]))の結果は、<class 'pandas.core.frame.DataFrame'> です。
エラーメッセージが一部分だけの様ですが、実際にエラーが発生しているのは
x_data = rri[0:nn-1] #x軸となるデータ
でしょうか?
> dfhrsはデータフレームになっています。
> print(type(dfhrs[1]))の結果は、<class 'pandas.core.frame.DataFrame'> です。
であれば、正確にはdfhrsはデータフレームのリスト(その各要素がデータフレーム)ではないでしょうか。
そのループ中のiがいくつで、どのようなデータフレームのときにエラーが発生したか分かるように
print(i)
df = dfhrs[i]
print(df)
hrr = df['HR']
と修正して実行した結果を提示ください。
canさん
> hrr = ['HR']
は、
hrr = df['HR']
でしょうか?
はい。修正しました
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)の関数の中身がおかしいのでしょうか。
> for文の中に
(略)
print(i)
を入れて実行しました。
を入れた場所は、「lorenz_plot(hrr)」よりも上ですか? 下ですか?
> 三つ目のデータフレームに問題があるのでしょうか
上ならば二つ目、下ならば三つ目ですね
【追記】
コメントのエラーを見たら分かりました
上ですね
失礼しました
「lorenz_plot(hrr)」よりも上に入れました。
もしかして、問題のデータフレームは空(empty)なのではないでしょうか。(query の結果が 0 行)
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)は実行できませんでした
追加した「df = dfhrs[i]」のすぐ下に下記を追加したら、どうなりますでしょうか?
df = df.reset_index()
ああ、なるほど、判りました。インデックスが 0 ではなく120 や 360 から始まっていることが原因ですね。となると、values を渡せばよいはずですが、それでもエラーになるとのことなので、各データフレームに対して reset_index(drop=True) を実行すればよいかと思います。
jbpb0さん、melianさん、can110さん、ありがとうございます。
df = df.reset_index() により解決致しました。長時間ご回答頂きありがとうございました。
回答1件
あなたの回答
tips
プレビュー