我有一个包含44522行的数据集,其中包含有关不同年份的信息。我需要使用嵌套循环计算每年的平均值。我有以下代码:
m= len(inf)
nrow, ncol = inf.shape
print(nrow, ncol)
years = [2010, 2011, 2012, 2013, 2014, 2015, 2016]
total = 0
index = None
for i in range(nrow):
year = inf.iloc[i, 0].year
data = inf.max_wave_height[i]
#print(year)
for j in range(len(years)):
date = years[j]
#print(date)
if year == date:
total = total + data
avg = total/(i+1)
index = i
else: break
此代码仅计算1年,然后停止。那不是我想要的。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
将break
更改为continue
:)
一旦if
评估为False就退出for循环,这是第一次date=2011
答案 1 :(得分:0)
如果没有看到您的数据框,很难给您一个有意义的答案。但总的来说,在这种情况下,最好的解决方案是使用Pandas resample()函数。
我将展示一个resample
解决方案,然后您可以将其应用到您自己的数据框中。
在第一部分中,我将使用您在问题中列出的年份的时间序列数据构建一个数据框仅用于演示:
years = pd.date_range('1/1/2010', '12/31/2016', freq='D')
print(years)
DatetimeIndex(['2010-01-01', '2010-01-02', '2010-01-03', '2010-01-04',
'2010-01-05', '2010-01-06', '2010-01-07', '2010-01-08',
'2010-01-09', '2010-01-10',
...
'2016-12-22', '2016-12-23', '2016-12-24', '2016-12-25',
'2016-12-26', '2016-12-27', '2016-12-28', '2016-12-29',
'2016-12-30', '2016-12-31'],
dtype='datetime64[ns]', length=2557, freq='D')
np.random.seed(seed=1111)
data = np.random.randint(1, high=100, size=len(years))
df = pd.DataFrame({'col1': years, 'col2': data})
print(df.head(10))
col1 col2
0 2010-01-01 29
1 2010-01-02 56
2 2010-01-03 82
3 2010-01-04 13
4 2010-01-05 35
5 2010-01-06 53
6 2010-01-07 25
7 2010-01-08 23
8 2010-01-09 21
9 2010-01-10 12
然后,使用resample()
找到每年平均值的实际解决方案非常简单。
df = df.set_index('col1')
annual_mean = pd.DataFrame()
annual_mean['Anual Mean'] = df.col2.resample('AS').mean()
print(annual_mean)
Anual Mean
col1
2010-01-01 48.723288
2011-01-01 48.931507
2012-01-01 49.237705
2013-01-01 50.386301
2014-01-01 49.715068
2015-01-01 49.753425
2016-01-01 47.346995