我希望对跨越 100 年的每一天的选定美国地点(特别是 8 个)的 100 年气候数据进行数据分析。我pandas dataFrame
设置了最高温度、最低温度、平均温度、降雪量、降水总量以及日、年和月值的列(然后,我有一个也基于日期时间值的索引)。现在,我想设置一个 for 循环来打印每年 90 华氏度或更高的第一个最高温度,但仅是第一个。最终,我想将范围缩小到我的 8 个位置中的每一个,但首先我只想让 for 循环工作。
对 for 循环的各种迭代进行了试验。
for year in range(len(climate['Year'])):
if (climate['Max'][year] >=90).all():
print (climate.index[year])
break
不出所料,我提供的循环输出打印了第一个 90 度日周期(从 1919 年开始,我的数据帧的开始)并中断。
for year in range(len(climate['Year'])):
if (climate['Max'][year] >=90).all():
print (climate.index[year])
break
1919-06-12 00:00:00
没关系。如果我取出 break 语句,将打印所有 90 度日,包括同一年的多个。我只想打印每年的第一个值。我是否需要设置第二个 for 循环以在一年中递增?如果我在尝试循环遍历计数器时明确说明年份,如下所示,循环仍然从 1919 年开始,并最终达到越界索引。我知道这个逻辑是错误的。
count = 1919
while count < 2019:
for year in range(len(climate['Year'])):
if (climate[climate['Year']==count]['Max'][year] >=90).all():
print (climate.index[year])
count = count+1
真诚地感谢任何输入。
您可以在没有第二个 for 循环的情况下实现这一点。假设climate
数据框按时间顺序排列,这应该做你想做的:
current_year = None
for i in range(climate.shape[0]):
if climate['Max'][i] >= 90 and climate['Year'][i] != current_year:
print(climate.index[i])
current_year = climate['Year'][i]
请注意,我们使用current_year
变量来跟踪我们已经打印了结果的最近一年。然后,在 if 检查中,我们检查是否已经打印了循环中当前行年份的结果。
这是一种方法,但我建议看一下pandas.DataFrame.groupby ,因为我认为它非常适合您的用例。您可以获得一个包含每年前 >=90 天的数据框,如下所示(再次假设climate
按时间顺序排列):
climate[climate.Max >= 90].groupby('Year').first()
这只是过滤数据框以仅包含 >=90 最大天数,将同一年的行分组在一起,并仅保留每个组的第一行。如果你有一个额外的 column Location
,你可以扩展它以获得相同的除了每年每个位置:
climate[climate.Max >= 90].groupby(['Location', 'Year']).first()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句