如何解决熊猫日均线
我在下面显示了df:
df = pd.DataFrame({'Name':['John']*12,'Type':[*'AABBBBAAABAB'],'Period':['Noon','Morning']*6,'Date':['1/1/2020']*2+['1/4/2020']*2+
['1/5/2020']*2+['1/2/2020']*2+
['1/3/2020']*2+['1/19/2020','1/31/2020'],'value':[1,2,7,8,9,10,3,4,5,6,6]},index=range(1,13))
基本上,我需要连续2天对一个人(以John为例)的值进行移动平均,并按类型和时期(人也是如此,但不在此表中)进行分类。
预期结果如最后一列所示。
例如1。早晨,约翰的B型第4行,在1/4/2020和1/3/2020(第10行)中的平均值为(6+8)/2=7
,
并且没有约翰类型B的1/3/2020之前的数据,因此row10结果为na
例如2。第11和12行不是连续的日期,因此都是na
如何使用熊猫实现此功能?我应该使用transform
还是rolling
?
解决方法
您可以使用以下内容:
df.set_index('Date')\
.groupby(['Name','Type','Period'])['value']\
.rolling('2D',min_periods=2)\
.mean()\
.reset_index()
输出:
Name Type Period Date value
0 John A Morning 2020-01-01 NaN
1 John A Morning 2020-01-02 3.0
2 John A Noon 2020-01-01 NaN
3 John A Noon 2020-01-02 2.0
4 John A Noon 2020-01-03 4.0
5 John A Noon 2020-01-19 NaN
6 John B Morning 2020-01-04 NaN
7 John B Morning 2020-01-05 9.0
8 John B Morning 2020-01-03 8.0
9 John B Morning 2020-01-31 NaN
10 John B Noon 2020-01-04 NaN
11 John B Noon 2020-01-05 8.0
而且,一种将其合并回原始数据框的方法:
df_er = (df.set_index('Date')
.groupby(['Name','Period'])['value']
.rolling('2D',min_periods=2)
.mean()
.rename('Expected Result'))
df.merge(df_er,left_on=['Name','Period','Date'],right_index=True)
输出:
Name Type Period Date value Expected Result
1 John A Noon 2020-01-01 1 NaN
2 John A Morning 2020-01-01 2 NaN
3 John B Noon 2020-01-04 7 NaN
4 John B Morning 2020-01-04 8 NaN
5 John B Noon 2020-01-05 9 8.0
6 John B Morning 2020-01-05 10 9.0
7 John A Noon 2020-01-02 3 2.0
8 John A Morning 2020-01-02 4 3.0
9 John A Noon 2020-01-03 5 4.0
10 John B Morning 2020-01-03 6 8.0
11 John A Noon 2020-01-19 5 NaN
12 John B Morning 2020-01-31 6 NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。