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
但最好是将column
reset_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
---
datetime
和transform
之间的差异:#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 by
df
输出大小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/