id      vi       dates     f_id
0  5532714  0.549501  2015-07-07    ff_22
1  5532715  0.540969  2015-07-08    ff_22
2  5532716  0.531477  2015-07-09    ff_22
3  5532717  0.521029  2016-07-09    ff_22
4  5532718  0.509694  2017-07-11    ff_22

在上面的数据框中,我想计算气候学,即跨越多年的数据框的日平均值。目前我尝试过:
df.index = pd.to_datetime(df.dates)
df.groupby([df.index.month, df.index.day])['vi'].transform('mean')

我希望输出没有多索引。

最佳答案

我想你需要分配到新的专栏:

df.index = pd.to_datetime(df.dates)
df['new'] = df.groupby([df.index.month, df.index.day])['vi'].transform('mean')
print (df)
                 id        vi       dates   f_id       new
dates
2015-07-07  5532714  0.549501  2015-07-07  ff_22  0.549501
2015-07-08  5532715  0.540969  2015-07-08  ff_22  0.540969
2015-07-09  5532716  0.531477  2015-07-09  ff_22  0.526253
2016-07-09  5532717  0.521029  2016-07-09  ff_22  0.526253
2017-07-11  5532718  0.509694  2017-07-11  ff_22  0.509694

df.index = pd.to_datetime(df.dates)
df = df.assign(new=df.groupby([df.index.month, df.index.day])['vi'].transform('mean'))
print (df)
                 id        vi       dates   f_id       new
dates
2015-07-07  5532714  0.549501  2015-07-07  ff_22  0.549501
2015-07-08  5532715  0.540969  2015-07-08  ff_22  0.540969
2015-07-09  5532716  0.531477  2015-07-09  ff_22  0.526253
2016-07-09  5532717  0.521029  2016-07-09  ff_22  0.526253
2017-07-11  5532718  0.509694  2017-07-11  ff_22  0.509694

必要时:
df = df.reset_index(drop=True)
print (df)
        id        vi       dates   f_id       new
0  5532714  0.549501  2015-07-07  ff_22  0.549501
1  5532715  0.540969  2015-07-08  ff_22  0.540969
2  5532716  0.531477  2015-07-09  ff_22  0.526253
3  5532717  0.521029  2016-07-09  ff_22  0.526253
4  5532718  0.509694  2017-07-11  ff_22  0.509694

但最好是将columnreset_index转换为date,这样就不需要datetime
df.dates = pd.to_datetime(df.dates)
df['new'] = df.groupby([df.dates.dt.month, df.dates.dt.day])['vi'].transform('mean')
print (df)

        id        vi      dates   f_id       new
0  5532714  0.549501 2015-07-07  ff_22  0.549501
1  5532715  0.540969 2015-07-08  ff_22  0.540969
2  5532716  0.531477 2015-07-09  ff_22  0.526253
3  5532717  0.521029 2016-07-09  ff_22  0.526253
4  5532718  0.509694 2017-07-11  ff_22  0.509694

如果由于某种原因无法将列转换为reset_index可以使用:
d = pd.to_datetime(df.dates)
df['new'] = df.groupby([d.dt.month, d.dt.day])['vi'].transform('mean')
print (df)
        id        vi       dates   f_id       new
0  5532714  0.549501  2015-07-07  ff_22  0.549501
1  5532715  0.540969  2015-07-08  ff_22  0.540969
2  5532716  0.531477  2015-07-09  ff_22  0.526253
3  5532717  0.521029  2016-07-09  ff_22  0.526253
4  5532718  0.509694  2017-07-11  ff_22  0.509694

---
datetimetransform之间的差异:
#changed sample data - dates
print (df)
        id        vi       dates   f_id
0  5532714  0.549501  2015-07-07  ff_22
1  5532715  0.540969  2016-07-07  ff_22
2  5532716  0.531477  2015-07-09  ff_22
3  5532717  0.521029  2016-07-11  ff_22
4  5532718  0.509694  2017-07-11  ff_22

aggregation用于原始GroupBy.transform中的新列-不更改输出DataFrame的大小,因此相同组的相同数据:
df.dates = pd.to_datetime(df.dates)
df['new'] = df.groupby([df.dates.dt.month, df.dates.dt.day])['vi'].transform('mean')
print (df)
        id        vi      dates   f_id       new
0  5532714  0.549501 2015-07-07  ff_22  0.545235
1  5532715  0.540969 2016-07-07  ff_22  0.545235
2  5532716  0.531477 2015-07-09  ff_22  0.531477
3  5532717  0.521029 2016-07-11  ff_22  0.515362
4  5532718  0.509694 2017-07-11  ff_22  0.515362

但是如果aggregate bydf输出大小GroupBy.mean发生更改,但其他列不在输出中(如果需要,则需要将每个列聚合df):
df.dates = pd.to_datetime(df.dates)
df1 = df.groupby([df.dates.dt.month, df.dates.dt.day])['vi'].mean()
        .rename_axis(('months', 'days')).reset_index()
print (df1)
   months  days        vi
0       7     7  0.545235
1       7     9  0.531477
2       7    11  0.515362

关于python - Pandas 的每日气候,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45205677/

10-16 07:29