Получите выгоду от серии Pandas

Я работал с некоторыми данными о температуре с помощью Pandas.

Из DataFrame под названием 'data' я получил первое наблюдение данных благодаря этой строке кода:

first_obs = data['DATE'][0]

Имейте в виду, что data['DATE'] — это объект pandas.Series. индексы данных: СТАНЦИЯ ВЫСОТА ШИРОТА ДОЛГОТА ДАТА PRCP TAVG TMAX TMIN ГОД МЕСЯЦ

После некоторых манипуляций с данными я создал новый DataFrame 'monthly_data' со следующими индексами: MONTH TAVG YEAR temp_celsius ref_temp diff abs_diff

Теперь я хотел получить строку этого фрейма данных с максимальным значением в столбце «abs_diff»:

weather_anomaly = monthly_data.loc[monthly_data['abs_diff'] == monthly_data['abs_diff'].max()]

Теперь Weather_anomaly — это еще один объект DataFrame, поэтому возникает странная проблема: если я напишу код, как раньше, вот так:

weather_anomaly['MONTH'][0]

выходит ошибка:

KeyError Traceback (последний последний вызов) ~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\indexes\base.py в get_loc(self, key, method, tolerance) 3079 try: - › 3080 возвращает self._engine.get_loc(casted_key) 3081, кроме KeyError как err:

pandas_libs\index.pyx в pandas._libs.index.IndexEngine.get_loc()

pandas_libs\index.pyx в pandas._libs.index.IndexEngine.get_loc()

pandas_libs\hashtable_class_helper.pxi в pandas._libs.hashtable.Int64HashTable.get_item()

pandas_libs\hashtable_class_helper.pxi в pandas._libs.hashtable.Int64HashTable.get_item()

Ошибка ключа: 0

Вышеупомянутое исключение было прямой причиной следующего исключения:

KeyError Traceback (последний последний вызов) в ----› 1 Weather_anomaly['МЕСЯЦ'][0] 2 print('Месяц с наибольшей температурной аномалией ', Weather_anomaly['МЕСЯЦ'].values[0], 'года', weather_anomaly['YEAR'].values[0], 'с разницей ', weather_anomaly['diff'].values[0])

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\series.py в getitem(self, key) 851 852 elif key_is_scalar: --› 853 return self ._get_value(ключ) 854 855, если is_hashable(ключ):

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\series.py in _get_value(self, label, takeable) 959 960 # Аналогично Index.get_value, но мы не возвращаемся к positional --› 961 loc = self.index.get_loc(label) 962 return self.index._get_values_for_loc(self, loc, label) 963

~\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\core\indexes\base.py в get_loc(self, ключ, метод, допуск) 3080
return self._engine.get_loc( casted_key) 3081, кроме KeyError as err: -> 3082 поднять KeyError(key) с err 3083 3084, если допуск не равен None:

Ошибка ключа: 0

Ничего поясняющего не приходит. К счастью, решить эту задачу легко:

weather_anomaly['MONTH'].values[0]

Итак, последний вопрос заключается в том, что несмотря на то, что data['DATE'] и month_data['abs_diff'] являются объектами pandas.Series, почему Weather_anomaly['abs_diff'][0] не работает?


person NikTheBoss    schedule 11.04.2021    source источник


Ответы (2)


Я предполагаю, что ваш исходный DataFrame имеет индексный столбец с увеличивающимися целыми числами, поэтому в вашем первом примере так получилось, что data['DATE'][0] и data['DATE'].iloc[0] возвращают один и тот же результат.

Но после того, как вы выберете конкретную строку с условием max(), новый кадр данных weather_anomaly будет содержать только одну строку, которая сохраняет исходный индекс, который может быть не равен нулю.

Следовательно, чтобы выбрать первую строку weather_anomaly, вам нужно либо использовать .iloc[0], либо reset_index() и использовать [0].

Я советую вам распечатать свои DataFrames, и вы ясно увидите, как ведет себя столбец индекса.

person tlouarn    schedule 11.04.2021

TL; DR Причина в том, что индекс weather_anomaly['MONTH'] не является обычным целым числом.

После некоторых манипуляций с данными я создал новый DataFrame monthly_data со следующими индексами: MONTH TAVG YEAR temp_celsius ref_temp diff abs_diff

weather_anomaly = monthly_data.loc[monthly_data['abs_diff'] == monthly_data['abs_diff'].max()]

Как вы указали выше, индекс monthly_data не является целым числом. После выполнения операции над monthly_data для получения weather_anomaly. Индекс weather_anomaly подобен monthly_data.

Если вы хотите найти серию по целому числу, вы можете использовать pandas. Series.iloc(). В вашем примере

weather_anomaly['MONTH'].iloc[0]
person Ynjxsjmh    schedule 11.04.2021