我在使用熊猫创建平均值时遇到了麻烦。我的问题是,我想结合每个冬季的11月,12月,1月,2月,3月的平均值来创建平均值,但是它们属于不同的年份,因此我不能只对一个日历内的这些值求平均值年。我尝试将数据分为两个日期时间对象。
nd_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([11,12])]
jfm_npi_obs = ndjfm_npi_obs[ndjfm_npi_obs.index.month.isin([1,2,3])]
..但是我在处理日期(年)以进行简单平均时遇到麻烦。我对熊猫没有经验,想知道是否有比出口卓越和改变年份更优雅的方式!数据为表格形式。
Date
1899-01-01 00:00:00 100994.0
1899-02-01 00:00:00 100932.0
1899-03-01 00:00:00 100978.0
1899-11-01 00:00:00 100274.0
1899-12-01 00:00:00 100737.0
1900-01-01 100655.0
1900-02-01 100633.0
1900-03-01 100512.0
1900-11-01 101212.0
1900-12-01 100430.0
答案 0 :(得分:1)
有趣的问题。由于您平均需要五个月以上的时间,因此重新采样更加棘手。您应该能够通过逻辑索引和构建新的数据框来克服这一问题。我认为您的索引是日期时间值。
index = pd.date_range('1899 9 1', '1902, 3, 1', freq='1M')
data = np.random.randint(0, 100, (index.size, 5))
df = pd.DataFrame(index=index, data=data, columns=list('ABCDE'))
# find rows that meet your criteria and average
idx1 = (df.index.year==1899) & (df.index.month >10)
idx2 = (df.index.year==1900) & (df.index.month < 4)
winterAve = df.loc[idx1 | idx2, :].mean(axis=0)
只需要目视检查索引/切片是否在执行我们需要的操作即可。...
>>>df.loc[idx1 | idx2, :]
Out[200]:
A B C D E
1899-11-30 48 91 87 29 47
1899-12-31 63 5 0 35 22
1900-01-31 37 8 89 86 38
1900-02-28 7 35 56 63 46
1900-03-31 72 34 96 94 35
您应该可以将其放入for循环中,以迭代多年,等等。
答案 1 :(得分:0)
使用pd.Grouper按月分组数据
g = df.groupby(pd.Grouper(freq="M")) # DataFrameGroupBy (grouped by Month)
对于每个组,仅计算“ A”列的平均值
monthly_averages = g.aggregate({"A":np.mean})