问题描述
我正在使用 Pandas 处理一些温度数据。
从名为“data”的DataFrame中,我得到了第一个数据观察,感谢这行代码:
first_obs = data['DATE'][0]
请记住 data['DATE'] 是一个 pandas.Series 对象。 数据索引:STATION ELEVATION LATITUDE LONGITUDE DATE PRCP TAVG TMAX TMIN YEAR MONTH
经过一些数据操作后,我创建了一个新的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 中尝试: -> 3080 返回 self._engine.get_loc(casted_key) 3081 除了 KeyError 作为错误:
pandas._libs.index.IndexEngine.get_loc() 中的pandas_libs\index.pyx
pandas._libs.index.IndexEngine.get_loc() 中的pandas_libs\index.pyx
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['MONTH'][0] 2 print('温度异常最大的月份是',weather_anomaly['MONTH'].values[0],'of the year ',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话 --> 853 返回 self._get_value(key) 854 第855话
~\AppData\Local\Programs\Python\python39\lib\site-packages\pandas\core\series.py 在 _get_value(self,label,takeable) 959 960 # 类似于Index.get_value,但我们不回退到位置 --> 961 loc = self.index.get_loc(label) 第962话 963
~\AppData\Local\Programs\Python\python39\lib\site-packages\pandas\core\indexes\base.py
在 get_loc(self、key、method、tolerance) 3080
返回 self._engine.get_loc(casted_key) 3081 除了
KeyError 作为错误:
-> 3082 从 err 3083 3084 引发 KeyError(key) 如果公差不是 None:
密钥错误:0
没有任何解释出现。 幸运的是,这个问题的解决方法很简单:
weather_anomaly['MONTH'].values[0]
所以最后一个问题是尽管 data['DATE'] 和monthly_data['abs_diff'] 都是熊猫。Series 对象为什么 weather_anomaly['abs_diff'][0] 不起作用?
解决方法
我假设您的原始 DataFrame 有一个带有递增整数的索引列,因此在您的第一个示例中,data['DATE'][0]
和 data['DATE'].iloc[0]
恰好返回相同的结果。
但是在您选择具有 max()
条件的特定行后,新的 DataFrame weather_anomaly
仅包含一行保留其原始索引,该行可能不为零。
因此,为了选择weather_anomaly
的第一行,您需要使用.iloc[0]
或reset_index()
并使用[0]
。
我建议你打印你的数据帧,你会清楚地看到索引列的行为。
,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]