从 pandas 数据框列中选择极端温度值,其中选择过程包括几个复杂的条件

问题描述 投票:0回答:1

拥有包含熊猫数据框中每日高温(以摄氏度为单位)的天气数据集,就像日期和每日高温一样简单(四舍五入到第十位值)。这是一个示例数据集:

data_dict = {
    'dates': ['2023-07-01', '2023-07-02', '2023-07-03', '2023-07-04', '2023-07-05', '2023-07-06', '2023-07-07', '2023-07-08', '2023-07-09', '2023-07-10', '2023-07-11', '2023-07-12', '2023-07-13', '2023-07-14', '2023-07-15', '2023-07-16', '2023-07-17', '2023-07-18', '2023-07-19', '2023-07-20', '2023-07-21', '2023-07-22', '2023-07-23', '2023-07-24', '2023-07-25', '2023-07-26', '2023-07-27', '2023-07-28', '2023-07-29', '2023-07-30', '2023-07-31', '2023-08-01', '2023-08-02'],
    'daily_high_temp': [39.1, 39.8, 40, 40.3, 40.4, 40.2, 40.4, 40.6, 41, 41.1, 40.9, 41.2, 40.9, 39.9, 41.2, 42, 42.3, 41.9, 40.7, 39.8, 41.1, 41.3, 40.9, 40.7, 40, 39.8, 41.2, 40.9, 39.6, 40.9, 41.4, 41.2, 41.4]
}
df = pd.DataFrame(data=data_dict)

想要创建另一个数据框列“extreme_highs”来记录多种条件下的极端高温。这些条件:

  1. 对于未记录的日期/时间,设置值 = 0
  2. 只有高于 40 摄氏度的温度才有资格进行记录。
  3. 从最早的日期开始,识别温度大于 40 度。
  4. 考虑到该日期/温度以及该日期之后的 3 天,记录日期/温度和最高温度。
  5. 如果四天窗口中的两个或多个日期/温度共享最高温度,则仅记录最高温度首次出现(最早出现)的日期/温度
  6. 记录日期/温度后,接下来的六天就没有资格记录。 7 天内仅记录一个日期/温度。

根据上面的数据和列出的条件,应该(希望)产生结果数据:

enter image description here

我已经在Excel中开发了一个解决方案,但是它很复杂。希望可以分享一个简单的“pythonic”解决方案,因为我很困惑!谢谢您的帮助!!!

python pandas dataframe conditional-statements
1个回答
0
投票

使用滑动窗口,找到argmax并相应填充,然后移动窗口。

i = 0
while i < len(df):
    if df.loc[i, 'daily_high_temp'] <= 40.0:
        i += 1
    else:
        max_index = df.loc[i:i+3, 'daily_high_temp'].argmax()
        df.loc[i+max_index, 'extreme_highs'] = df.loc[i+max_index, 'daily_high_temp']
        i += max_index+6+1

df = df.fillna(0)
© www.soinside.com 2019 - 2024. All rights reserved.