#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
иным образом.
Значения из словаря затем будут суммированы и добавлены в качестве новой записи (общая продолжительность сна).