как мне решить ключевую ошибку из-за отсутствия списка

#python #key

Вопрос:

Я думаю, что моя проблема в том, что не каждый файл, который я анализирую, содержит все элементы в моем списке sleep_stages, но я не уверен, как это исправить. Например, некоторые файлы не будут содержать никаких упоминаний о стадии сна N1 или другом элементе из списка. Я хотел бы иметь возможность вводить na только для этого значения, но захватывать другие значения из элементов списка. см. код:

 def get_sleep_times(hypno):  sleep_stages=['Sleep stage N1','Sleep stage R','Sleep stage N2', 'Sleep   stage N3', 'Sleep stage ?']  sleep_times = {}  totsleep_time = 0  tmp = hypno.groupby('description')['duration'].sum()  for stage in sleep_stages:  sleep_times['Duration of '  stage]=tmp.loc[stage]  totsleep_time  = tmp.loc[stage]  sleep_times['Total Sleep Duration'] = totsleep_time  return sleep_times see error message:       KeyError Traceback (most recent call last) ~Anaconda3libsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)  3360 try: -gt; 3361 return self._engine.get_loc(casted_key)  3362 except KeyError as err:  ~Anaconda3libsite-packagespandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()  ~Anaconda3libsite-packagespandas_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()  pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()  pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()  KeyError: 'Sleep stage ?'  The above exception was the direct cause of the following exception:  KeyError Traceback (most recent call last) ~AppDataLocalTemp/ipykernel_21360/487801242.py in lt;modulegt; ----gt; 1 hypno_report(dfpmnospcl)  ~AppDataLocalTemp/ipykernel_21360/1936770717.py in hypno_report(df)  16 print(fnames, matches)  17 hypno = pd.read_csv(matches[0], delimiter='t',encoding='utf-8') ---gt; 18 result.update(get_sleep_times(hypno))  19 result.update(get_hypno_counts(hypno, events))  20 results.append(result)  ~AppDataLocalTemp/ipykernel_21360/2297364264.py in get_sleep_times(hypno)  12   13 else: ---gt; 14 sleep_times['Duration of '  stage]=tmp.loc[stage]  15 totsleep_time  = tmp.loc[stage]  16   ~Anaconda3libsite-packagespandascoreindexing.py in __getitem__(self, key)  929   930 maybe_callable = com.apply_if_callable(key, self.obj) --gt; 931 return self._getitem_axis(maybe_callable, axis=axis)  932   933 def _is_scalar_access(self, key: tuple):  ~Anaconda3libsite-packagespandascoreindexing.py in _getitem_axis(self, key, axis)  1162 # fall thru to straight lookup  1163 self._validate_key(key, axis) -gt; 1164 return self._get_label(key, axis=axis)  1165   1166 def _get_slice_axis(self, slice_obj: slice, axis: int):  ~Anaconda3libsite-packagespandascoreindexing.py in _get_label(self, label, axis)  1111 def _get_label(self, label, axis: int):  1112 # GH#5667 this will fail if the label is not present in the axis. -gt; 1113 return self.obj.xs(label, axis=axis)  1114   1115 def _handle_lowerdim_multi_index_axis0(self, tup: tuple):  ~Anaconda3libsite-packagespandascoregeneric.py in xs(self, key, axis, level, drop_level)  3774 raise TypeError(f"Expected label or tuple of labels, got {key}") from e  3775 else: -gt; 3776 loc = index.get_loc(key)  3777   3778 if isinstance(loc, np.ndarray):  ~Anaconda3libsite-packagespandascoreindexesbase.py in get_loc(self, key, method, tolerance)  3361 return self._engine.get_loc(casted_key)  3362 except KeyError as err: -gt; 3363 raise KeyError(key) from err  3364   3365 if is_scalar(key) and isna(key) and not self.hasnans:  KeyError: 'Sleep stage ?'  

Ответ №1:

Это может не сработать должным образом, так как я не знаю, как hypno это выглядит. Было бы полезно, если бы вы могли описать его структуру в следующий раз.

 def get_sleep_times(hypno):     sleep_stages=['Sleep stage N1', 'Sleep stage R', 'Sleep stage N2', 'Sleep stage N3', 'Sleep stage ?']   tmp = hypno.groupby('description')['duration'].sum()   sleep_times = {'Duration of '   stage: tmp.loc[stage] if stage in tmp.columns else None for stage in sleep_stages}  sleep_times['Total sleep duration: '] = sum(sleep_times.values())    return sleep_times   

sleep_times Словарь будет содержать продолжительность каждого этапа (если название этапа присутствует в названиях столбцов tmp ) или None иным образом.

Значения из словаря затем будут суммированы и добавлены в качестве новой записи (общая продолжительность сна).