我有一个DataFrame,其中包含美国8个城市100年每天的气候观测数据。对于这8个城市,我具有最高温度,最低温度,平均,降雪和降水的每日值。我正在为每个位置计算“冷快照”。粗略的定义是,我最初连续3天认为最高温度降到32°F或以下。我能够毫无问题地添加两列(使用shift后的第二天和使用shift后的第二天的最高温度值),然后在满足条件的地方numpy。但是,我想对此进行调整,因为对于我的数据集中的南部城市(坦帕,达拉斯,洛杉矶)来说,最高气温低于32的情况很少(如果有的话)适用。这就是混乱的地方。
仅考虑最高温度低于32时成功进行迭代:
climate['DayAfter'] = climate.Max.shift(-1)
climate['DayAfterNext'] = climate.Max.shift(-2)
climate['ColdSnap'] = 0
climate['ColdSnap'] = np.where((climate['DayAfter']<=32) & (climate['Max']<=32) & (climate['DayAfterNext']<=32) & (climate.shift(1)['ColdSnap']!=1) & (climate.shift(2)['ColdSnap']!=1), 1, np.nan)
注意:我添加了两个shift语句,以确保冷快照不会被重复计算(我只希望这是3天的独特时间)。
尝试在我的不同地区考虑不同的冷快照标准(非常主观):
费城,博尔德,克利夫兰(最大值小于或等于32) 大叉子(最大低于或等于20) 洛杉矶和坦帕(最大低于或等于60)
conditions = [(climate[(climate['City']=='PHL') | (climate['City']=='CLE') | (climate['City']=='BOU')]['DayAfter']<=32) & (climate[(climate['City']=='PHL') | (climate['City']=='CLE') | (climate['City']=='BOU')]['Max']<=32) & (climate[(climate['City']=='PHL') | (climate['City']=='CLE') | (climate['City']=='BOU')]['DayAfterNext']<=32), (climate[(climate['City']=='TAM') | (climate['City']=='LA')]['DayAfter']<=60) & (climate[(climate['City']=='TAM') | (climate['City']=='LA')]['Max']<=60) & (climate[(climate['City']=='TAM') | (climate['City']=='LA')]['DayAfterNext']<=60), (climate[(climate['City']=='SEA') | (climate['City']=='DAL')]['Max']<=40)]
choices = [1, 1, 1, 1]
climate['ColdSnap'] = np.select(conditions, choices, default=np.nan)
错误:
ValueError:形状不匹配:无法将对象广播到单个对象 形状
我想尝试遵循此处详细介绍的技术:https://stackoverflow.com/a/39111919/11386256但我担心在涉及城市和温度比较时,我有太多依赖项。这里的循环会更好吗?问题在于,在我最初使用for循环进行探索时,处理时间过长,与我的数据集大小无关。我衷心感谢您的任何见解,希望与基于其他列依赖项的关于列的问题不太相似。我尝试匹配其他答案,但似乎没有一个适合我的情况!